簡體   English   中英

簡化許多SED命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM