Bash 简化大量SED命令

Bash 简化大量SED命令,bash,sed,Bash,Sed,我使用以下命令重写一些maxscale输出,以便能够在其他软件中使用: maxadmin list servers | sed -r 's/[^a-z 0-9]//gi;/^\s*$/d;1,3d;' | awk '$1=$1' | cut -d ' ' -f 1,5 | sed -e 's/ /":"/g' | sed -e 's/\(.*\)/"\1"/' | tr '\n' ',' | sed 's/.$/}\n/' | sed 's/^/{/' 我认为这是一种使我想做的事情变得复杂的方

我使用以下命令重写一些maxscale输出,以便能够在其他软件中使用:

maxadmin list servers | sed -r 's/[^a-z 0-9]//gi;/^\s*$/d;1,3d;' | awk '$1=$1' | cut -d ' ' -f 1,5 | sed -e 's/ /":"/g' | sed -e 's/\(.*\)/"\1"/' | tr '\n' ',' | sed 's/.$/}\n/' | sed 's/^/{/'
我认为这是一种使我想做的事情变得复杂的方式,但我自己也看不到更简单的版本。我想重写maxadmin列表服务器的输出:

为此:

{"svrnode1":"Master","svrnode2":"Slave","svrnode3":"Slave"}
我的命令做得很好,但正如我所说的,应该有一种更简单的方法,希望运行更少的sed命令。

您可以使用awk,如下所示:

json.awk

按如下方式运行:

maxadmin list servers | awk -f json.awk
maxadmin list servers | awk '
    BEGIN{printf"{"}
    NR>4&&!/^([-]|$)/{
        sub(/,/,"",$9)
        printf"%s\"%s\":\"%s\"",s,$1,$9
        s=","
    }
    END{print"}"}'
输出:

{"svr_node1":"Master","svr_node2":"Slave","svr_node3":"Slave"}
在评论中提出了一个问题,即如何在没有额外的json.awk文件的情况下实现这一点:

丑陋,但有效

如果你想把它放到shell脚本中,考虑这样的多行版本:

maxadmin list servers | awk -f json.awk
maxadmin list servers | awk '
    BEGIN{printf"{"}
    NR>4&&!/^([-]|$)/{
        sub(/,/,"",$9)
        printf"%s\"%s\":\"%s\"",s,$1,$9
        s=","
    }
    END{print"}"}'

这确实是一个伟大的解决方案,但是我应该澄清一下,我需要在一行中执行这个命令,没有额外的文件,因此多个sed命令的管道非常糟糕。我添加了一个版本,没有额外的json.awkGlad,这有助于您我投票结束这个问题,因为要求检查工作代码的问题应该转到codereview.stackexchange.com我想知道问题中的awk“$1=$1”是什么意思。请先清理代码,然后再发布到此处。在这种情况下,工作是相对的,但这是肯定的。我的问题已经回答了,所以我很高兴。并回答代码清理问题。不幸的是,这真的是我能做的最好的了。如果我去掉它,它就不起作用了,所以是的。
maxadmin list servers | awk '
    BEGIN{printf"{"}
    NR>4&&!/^([-]|$)/{
        sub(/,/,"",$9)
        printf"%s\"%s\":\"%s\"",s,$1,$9
        s=","
    }
    END{print"}"}'