Regex 使用sed匹配具有一个表达式的多个模式,并删除到一个空行
在RHEL 6.6系统上,使用ifconfig和GNU-sed,我只想显示不是逻辑子接口的以太网接口或环回 例如,输出不应包含接口名称类似于eth0:134或lo的接口记录 到目前为止,我的方法是将sed与两个表达式一起使用,第一个表达式,Regex 使用sed匹配具有一个表达式的多个模式,并删除到一个空行,regex,bash,awk,sed,Regex,Bash,Awk,Sed,在RHEL 6.6系统上,使用ifconfig和GNU-sed,我只想显示不是逻辑子接口的以太网接口或环回 例如,输出不应包含接口名称类似于eth0:134或lo的接口记录 到目前为止,我的方法是将sed与两个表达式一起使用,第一个表达式,/eth[0-9]:/,用于匹配并包括包含“ethno:”的所有行,包括在遇到空行之前的每一行,然后删除,第二个表达式用于匹配,/lo/以及在遇到空行之前的所有行,并删除它们 例如: [user@system ~]$ ifconfig -a | sed '/e
/eth[0-9]:/
,用于匹配并包括包含“ethno:”的所有行,包括在遇到空行之前的每一行,然后删除,第二个表达式用于匹配,/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的解决方案也可以。试试:
ifconfig -a | sed -r '/(eth[0-9]{1,2}:|eth100:|lo)/,/^$/d'
{1,2}
指上述一项或两项。因此,eth[0-9]{1,2}
匹配eth
,后跟一个或两个数字
(A | B | C)
匹配A
或B
或C
。因此,(eth[0-9]{1,2}:| eth100:| lo)
将eth
与一个或两个数字或eth100
与冒号或lo
匹配
用于扩展正则表达式(ERE)的-r
。如果没有-r
,sed
默认为基本正则表达式(BRE)。在GNU sed上,BRE的工作方式相同,但代价是额外的反斜杠:
ifconfig -a | sed '/\(eth[0-9]\{1,2\}:\|eth100:\|lo\)/,/^$/d'
BSD/OSX
BSD(OSX)sed无法识别-r
选项。要获得扩展正则表达式,请改用-E
:
ifconfig -a | sed -E '/(eth[0-9]{1,2}:|eth100:|lo)/,/^$/d'
-E
还可以与最新版本的GNUsed
配合使用。听起来您需要的只是:
awk -v RS= -v ORS='\n\n' '$1~/^eth[0-9]+$/'
e、 g:
如果您只想匹配接口编号0到100,只需将其调整为:
awk -v RS= -v ORS='\n\n' '$1~/^eth([1-9]?[0-9]|100)$/'
根据Ed Morton的评论,非期望的输出包含所有相同的行,第一列中的接口名称更改为包含ethno:和一个数值或字符串lo,然后是特定于该特定接口的6行附加输出。编辑以包含非期望的输出和附加解释。谢谢你的反馈。我真的希望得到简单的“输入”和“想要的输出”-这给了我们一些容易测试的东西,而不是必须从“想要的输出”和“不想要的输出”拼凑一个输入文件并做出假设。话虽如此,您现在发布的内容确实有所帮助,所以我更新了我的答案。这是一个很好的技巧,其中有1或2个步骤。谢谢你的例子。@A.Danischewski谢谢。在我的系统中,ifconfig的
lo
行有一个冒号。根据你的建议,我去掉了冒号,以防万一。在另一个问题上,只有GNU-sed的最新版本支持-E
标志(它仍然没有文档记录)。OP表示他使用的是RHEL 6,我不清楚它是否足够新以支持-E
。根据手册页,我的RHEL 6.6框上的sed版本是GNU sed版本4.2.1,它不支持“-E”选项。但是,此框处于“气隙”环境中,可能没有可用的最新版本。我可以确认“-E”在GNU sed版本为4.2.1的框上工作,但未记录,并且未在手册页中作为参数列出。“E”在GNU-sed版本为4.1.5的RHEL 5.10机器上不起作用。当使用由提供的命令时,它将打印sed的使用示例John1024@ChrisSmith谢谢你的研究!这就是为什么在回答中,我没有向您推荐-E
。不过,为了确认一下,其他命令(不使用-E
的命令)是否适用于您?请帮助我了解这里的“+$”是做什么的?是否在[0-9]之后立即停止匹配?我忽略了如何匹配一个一位数字段或两位数字段的概念,而不是后跟冒号“:”字符的一位数或两位数字段。感谢尝试添加{1,2}在任何输出上都不匹配。例如:ifconfig-a | awk-v RS=-v ORS='\n\n'$1~/^eth[0-9]{1,2}+$/'返回任何内容,我认为这是有效的,并且将匹配0-99 awk-v RS=-v ORS='\n\n'$1~/^eth[0-9].[0-9][0-9]| 100/&&$1!~://'然而,我又使用了两个表达式,正如@A.Danischewski所指出的,可能会有很大的IO惩罚。+
表示前面的regexp元素的1个或多个重复
,$
表示字符串结尾
so[0-9]+$
表示一个或多个紧跟字符串结尾的数字
,因此它将匹配任何数字序列,但不会匹配后跟任何其他字符的数字,包括:
。您为什么要尝试更改它?它按原样工作,对吗{1,2}
表示前面regexp元素的1或2个重复+
表示前面的regexp元素的1个或多个重复
。我不知道您认为{1,2}+
可能意味着什么,也不知道regexp引擎将如何处理它,所以我并不奇怪您使用它时没有得到任何输出。使用c语言没有IO惩罚
$ awk -v RS= -v ORS='\n\n' '$1~/^eth[0-9]+$/' file
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)
awk -v RS= -v ORS='\n\n' '$1~/^eth([1-9]?[0-9]|100)$/'