Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed匹配具有一个表达式的多个模式,并删除到一个空行_Regex_Bash_Awk_Sed - Fatal编程技术网

Regex 使用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

在RHEL 6.6系统上,使用ifconfig和GNU-sed,我只想显示不是逻辑子接口的以太网接口或环回

例如,输出不应包含接口名称类似于eth0:134或lo的接口记录

到目前为止,我的方法是将sed与两个表达式一起使用,第一个表达式,
/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
还可以与最新版本的GNU
sed

配合使用。听起来您需要的只是:

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)$/'