【发布时间】:2016-07-12 20:48:09
【问题描述】:
在 RHEL 6.6 系统上,使用 ifconfig 和 GNU sed,我只想显示不是逻辑子接口的以太网接口或环回。
例如,输出不应包含接口名称为 eth0:134 或 lo 的接口记录。
到目前为止,我的方法是使用 sed 和两个表达式,第一个 /eth[0-9]:/ 匹配并包含所有包含 'ethN: 的行,包括之后的每一行,直到遇到空行,然后删除,以及要匹配的第二个表达式,/lo/ 和之后的所有行,直到一个空行,并删除它们。
例如:
[user@system ~]$ ifconfig -a | sed '/eth[0-9]:/,/^$/d; /lo/,/^$/d'
eth0 Link encap:Ethernet HWaddr 00:11:22:33:44:55
inet addr:192.168.0.50 Bcast: 192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1024 ERRORS:0 DROPPED:0 OVERRUNS:0 FRAME:0
TX packets:2048 ERRORS:0 DROPPED:0 OVERRUNS:0 FRAME:0
collisions:0 txqueuelen:1000
RX bytes:6455319 (6.1 MiB) TX bytes: 258478 (252.4 KiB)
不想要的输出看起来像:
eth0:146 Link encap:Ethernet HWaddr 00:11:22:33:44:55
inet addr:192.168.0.51 Bcast: 192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:147 Link encap:Ethernet HWaddr 00:11:22:33:44:55
inet addr:192.168.0.52 Bcast: 192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric
eth0:148 Link encap:Ethernet HWaddr 00:11:22:33:44:55
inet addr:192.168.0.53 Bcast: 192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric
lo Link encap:Local Lookback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:605 errors:0 dropped:0 overruns:0 frame:0
TX packets:605 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:59008 (57.6 KiB) TX bytes:59008 (57.6 KiB)
我喜欢这种删除从匹配行开始并包括匹配行直到遇到空行 (^$) 的所有输出行的方法,因为在包含接口名称的行之后有可变数量的额外行。在这种情况下,可以是 2 行、附加行或 6 个附加行。
此方法允许多输出 N 行,只要在显示的界面记录之间仍使用空行作为分隔符。
第二个表达式/lo/,/^$/d'如何与第一个结合起来?
也许另一种匹配(或不匹配)行的方法更好?
另一个问题是它只匹配前 10 个接口。不超过 10 个,但如果有的话,最好考虑一下。
我想在前 100 个接口上匹配如下内容:
^[1-9][0-9]?$|^100$
使用 awk 的解决方案也可以。
【问题讨论】:
-
根据 Ed Morton 的评论,UN-desired 输出包含所有相同的行,只是第一列中的接口名称更改为包含 ethN: 和一个数值或字符串 lo,随后是特定于该特定接口的 6 行附加输出。
-
已编辑以包含不需要的输出和附加说明。感谢您的反馈。
-
我真的希望简单的“输入”和“想要的输出” - 这给了我们一些可以轻松测试的东西,而不是必须将来自“想要的输出”和“不需要的输出”的输入文件拼凑在一起并做出假设。话虽如此,你现在发布的内容确实有帮助,所以我更新了我的答案。