替换IP地址和空格

时间:2016-03-09 23:58:24

标签: unix sed grep sh netbsd

我正在尝试转换ifconfig -a以提供具体的输出,但我不确定sed是否表现良好。有可能特定版本的sed没有按预期执行(由于不同的sed对应物)。

我的ifconfig -a输出(我只想查看网络掩码):

    xennet0: flags=8863<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST> mtu 1500
            capabilities=2800<TCP4CSUM_Tx,UDP4CSUM_Tx>
            enabled=0
            address: 0a:3d:c0:98:c6:73
            inet 172.31.11.166 netmask 0xfffff000 broadcast 172.31.15.255
            inet6 fe80::83d:c0ff:fe98:c673%xennet0 prefixlen 64 scopeid 0x1
    lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33184
            inet 127.0.0.1 netmask 0xff000000
            inet6 ::1 prefixlen 128
            inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2

需要的输出(转换输出):

 0xfffff000
 0xff000000

我失败的尝试:

ifconfig -a | egrep "0xf." | sed 's/inet //' | sed 's/netmask //' |
sed 's/ broadcast//' | sed 's/([0-9]{1,3}\.){3}[0-9]{1,3}//g' | sed 's/\s+//'

它给了我输出:

        172.31.11.166 0xfffff000 172.31.15.255
        127.0.0.1 0xff000000

我希望它能提供我所需的输出。

帮助将是非常有帮助的。我使用的是NetBSD 6.1.5(Amazon EC2),但我相信任何一般的装置都可以使用。

4 个答案:

答案 0 :(得分:1)

使用GNU grep,我使用带有-o选项的Perl正则表达式(仅保留匹配项):

$ ifconfig -a | grep -Po '(?<=\bnetmask )\w*'
0xfffff000
0xff000000

对于BSD grep,我们没有-P选项,我们可以使用awk或cut来获取第二部分,如

$ ifconfig -a | grep -o '\bnetmask [^ ]*' | cut -d ' ' -f 2
0xfffff000
0xff000000

如果你真的想使用sed,你可以这样做:

$ ifconfig -a | sed -n 's/.*\bnetmask \([^ ]*\).*/\1/p'
0xfffff000
0xff000000

这与Eric的回答非常相似。它使用-n抑制输出,对于包含netmask的行,它会提取其后面的单词并使用(p标志)打印它。

答案 1 :(得分:1)

虽然使用sed进行此操作可能很有意思,但我建议awk作为此(以及任何类似)工作的正确工具:

ifconfig -a | awk '{ for (i = 1; i < NF; i++) {if ($i == "netmask") { print $(i+1); next; } }}'

答案 2 :(得分:0)

在某些方面,你做得太难了。并使用比严格要求更多的命令。这是一个命令行,它只需要一个sed(1)调用即可完成所需的操作:

ifconfig -a | sed -ne '/inet /s/^.* netmask \(.*\) broadcast.*$/\1/p'

说明:&#34; / inet /&#34;告诉sed(1)只选择包含该字符串的行,然后应用表达式的其余部分。表达式的其余部分从关键字&#34; netmask&#34;之间删除网络掩码。和&#34;广播&#34;,并打印结果。

&#34; -n&#34;在sed(1)命令行上告诉sed(1)不要打印他们检查过的行。 &#34; -e&#34;说下一个参数是内联的sed(1)脚本。

根据我的评论,错过了*。

将模式更改为:

'/inet /s/^.* netmask \(0x[0-9a-fA-F]*\).*$/\1/p'

创建所需的结果。 (包括运行inet的所有接口,包括lo *)

答案 3 :(得分:0)

使用带扩展正则表达式的Grep

您可以使用grep的ERE引擎和--only-matching标志来仅提取十六进制值。为此,请使用egrepgrep -E启用扩展正则表达式。例如:

$ egrep -o '0x[[:xdigit:]]{8}' /tmp/corpus 
0xfffff000
0xff000000

同样,您也可以输出输出并获得相同的结果:

$ ifconfig -a | egrep -o '0x[[:xdigit:]]{8}'

这适用于GNU和BSD greps,并且不依赖于PCRE库。因此,它应该适用于大多数现代系统,而无需调整任何内容。