我有一个命令返回以下内容:
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”。