[英]Simplify lots of SED command
我有以下命令可用於重寫一些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命令。
您可以使用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
文件的情況下實現這一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"}"}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.