使用 bash 命令列編寫 IP 字串

使用 bash 命令列編寫 IP 字串

我有一個命令返回以下內容:

 id1="172" id2="17" id3="136" id4="5" id5="0" />
 id1="172" id2="17" id3="128" id4="2" id5="0" />
 id1="172" id2="17" id3="128" id4="4" id5="0" />
 id1="172" id2="17" id3="128" id4="6" id5="0" />

前四個 ID 組合起來代表一個 IP 位址(例如172.17.136.5第一行)。

我想將上面的內容透過管道傳輸到一個解析命令,該命令將輸出一個字串,其中所有 IP 位址均以空格分隔。

對於上面的例子:

myVariable="172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6"

我怎樣才能做到這一點?

答案1

您可以awk最輕鬆地使用命令來完成此操作:

your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}'

若要將其設為變量,請使用命令替換:

myVariable="$(your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"

-F將輸入欄位分隔符號(預設為任何空格)設定為自訂值;在本例中是雙引號 ( ")。

-v允許您設定awk變數。

OFS是輸出欄位分隔符,預設為單一空格。我們將其設定為一個句點。

ORS是輸出記錄分隔符,預設為換行符。我們將其設定為一個空格。

然後我們列印輸入的每一行的第二、第四、第六和第八欄位。


範例輸出:

$ cat temp
 id1="172" id2="17" id3="136" id4="5" id5="0" />
 id1="172" id2="17" id3="128" id4="2" id5="0" />
 id1="172" id2="17" id3="128" id4="4" id5="0" />
 id1="172" id2="17" id3="128" id4="6" id5="0" />
$ myVariable="$(cat temp | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
$ echo "$myVariable" 
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6 
$ 

答案2

myvariable=$(yourmysterycommand |
               sed -e 's/id1=//;
                       s/id5=.*//;
                       s/"//g;
                       s/id.=/./g;
                       s/[[:blank:]]\+//g' |
               paste -sd' ')

這是一行行,但為了可讀性而重新格式化了額外的換行符和縮排。

$ echo "$myvariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6

sed命令刪除字串id1=,然後刪除id5=和 後面的所有內容,然後刪除所有雙引號字元 ( "),將所有出現的 更改id.=為文字.,最後從該行中刪除所有空白字元(空格和/或製表符)。

paste指令使用空格字元作為分隔符號來連接行。


順便說一句,更好的解決方案是修復以這種無用且愚蠢的格式列印 IP 位址的程式。 IP 位址中的八位元位元組不是任何類型的「id」。

相關內容