简化大量SED命令

时间:2017-08-16 13:45:27

标签: 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/^/{/'

我认为这是我想要做的事情的复杂方法,但我自己无法看到更简单的版本。我想要的是重写它( maxadmin列表服务器的输出):

Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
svr_node1          | 192.168.178.1 |  3306 |           0 | Master, Synced, Running
svr_node2          | 192.168.178.1 |  3306 |           0 | Slave, Synced, Running
svr_node3          | 192.168.178.1 |  3306 |           0 | Slave, Synced, Running
-------------------+-----------------+-------+-------------+--------------------

进入这个:

{"svrnode1":"Master","svrnode2":"Slave","svrnode3":"Slave"}

我的命令做得很好,但正如我所说,应该有一种更简单的方法,希望运行更少的sed命令。

1 个答案:

答案 0 :(得分:1)

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

json.awk

BEGIN {
    printf "{" 
}
# Everything after line for and before the last ------ line
# plus the last empty line (if any).
NR>4&&!/^([-]|$)/{
    sub(/,/,"",$9) # Remove trailing comma
    printf "%s\"%s\":\"%s\"",s,$1,$9
    s="," # Set comma separator after first iteration
}
END {
    print "}" 
}

像这样运行:

maxadmin list servers | awk -f json.awk

输出:

{"svr_node1":"Master","svr_node2":"Slave","svr_node3":"Slave"}

在评论中提出了如何在没有额外json.awk文件的情况下实现这一目标的问题:

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

丑陋,但有效。 ;)

如果您想将其放入shell脚本中,请考虑这样的多行版本:

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