我使用以下命令重写某些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命令。
答案 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"}"}'