我正在尝试转换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),但我相信任何一般的装置都可以使用。
答案 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的ERE引擎和--only-matching
标志来仅提取十六进制值。为此,请使用egrep
或grep -E
启用扩展正则表达式。例如:
$ egrep -o '0x[[:xdigit:]]{8}' /tmp/corpus
0xfffff000
0xff000000
同样,您也可以输出输出并获得相同的结果:
$ ifconfig -a | egrep -o '0x[[:xdigit:]]{8}'
这适用于GNU和BSD greps,并且不依赖于PCRE库。因此,它应该适用于大多数现代系统,而无需调整任何内容。