我有一個命令返回以下內容:
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」。