使用 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”。

相关内容