我不确定这是否可以在单个正则表达式中使用,或者我是否需要两个。
我有一个看起来像的字符串:
route-table arlrt2
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
route-table arlrt3
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
route-table arlrt3
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
我想提取特定路线表的路线信息。理想情况下,我会有一个包含例如" testroute p 1.0 / 24 np 10.4"等字符串的路由列表。
我找到了如何获得所有路线
(route .*\s)
或如何在路线表下获得单一路线
route-table arlrt2\s.*\s*( route .*\s)
但是我似乎无法弄清楚如何在路由表下找到所有路由。
任何帮助将不胜感激。
答案 0 :(得分:0)
如果您想匹配路由表部分,请执行以下操作:
^route-table(?:.*\s*){5}$
在线测试:
^route-table(?:.*\s*){5}$
可能会对您有所帮助,您应该注意匹配依赖于 fix-line-size ;这里 {5} 。此外,它将输入视为:多行模式。当然,我们可以使用 lazy star .*?
进行单行模式,如下所示:
^route-table(?:.*?$\s*){5}$
试验:
^route-table(?:.*?$\s*){5}$
但你要解析,这是一个 Perl单行解决方案,我假设你有一个看起来像这样的输入:
##############################
other stuff
##############################
route-table arlrt2 // line 1
rg arlrg2 // line 2
route testroute p 1.0/24 np 10.4 // line 3
route route2 p 1.0/24 np 10.4 // line 4
route route3 p 1.0/24 np 10.4 // line 5
##############################
other stuff
##############################
route-table arlrt3
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
##############################
other stuff
##############################
route-table arlrt3
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
##############################
other stuff
##############################
解析仍依赖于fix-line-size
,此处为5 。
现在,为了访问这些部分(= route-table(s)),我们可以:
perl -lne '$s=$.;($e=$s+5) if/route-table/g; print if $s++<$e' file
输出:
route-table arlrt2
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
route-table arlrt3
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
route-table arlrt3
rg arlrg2
route testroute p 1.0/24 np 10.4
route route2 p 1.0/24 np 10.4
route route3 p 1.0/24 np 10.4
然后,for:单个路由表下的所有路由,最好解析成列表
您可以在!/(?:route-table|rg)
所以:
perl -ne '$s=$.;($e=$s+5) if/route-table.*?$/g && ($rt=$&); push(@L,$_) if $s++<$e && !/(?:route-table|rg)/;if($s==$e){print @L;@L=()}' file
输出:
route testroute p 1.0/24 np 10.4 #1
route route2 p 1.0/24 np 10.4 #1
route route3 p 1.0/24 np 10.4 #1
route testroute p 1.0/24 np 10.4 #2
route route2 p 1.0/24 np 10.4 #2
route route3 p 1.0/24 np 10.4 #2
route testroute p 1.0/24 np 10.4 #3
route route2 p 1.0/24 np 10.4 #3
route route3 p 1.0/24 np 10.4 #3
请注意,我添加了{#1
和#2
以及#3
)以澄清输出。
每个route
都位于@L
,您可以通过
全部:@L
一些(第一和第二):@L[0,1]
如果您愿意看到单行中的输出未分隔的行,您可以添加-l
选项以影响输出分隔符
所以:
perl -lne '$s=$.;($e=$s+5) if/route-table.*?$/g && ($rt=$&); push(@L,$_) if $s++<$e && !/(?:route-table|rg)/;if($s==$e){print @L;@L=()}' file
有输出:
route testroute p 1.0/24 np 10.4 #1 route route2 p 1.0/24 np 10.4 #1 route route3 p 1.0/24 np 10.4 #1
route testroute p 1.0/24 np 10.4 #2 route route2 p 1.0/24 np 10.4 #2 route route3 p 1.0/24 np 10.4 #2
route testroute p 1.0/24 np 10.4 #3 route route2 p 1.0/24 np 10.4 #3 route route3 p 1.0/24 np 10.4 #3
如果您注意到,我将匹配$&
的结果存储到变量$rt
中,您可以稍后在第二个if
条件下使用它。例如,为输出标题,例如:
... print "$rt =>",@L;@L=()}' file
输出:
route-table arlrt2 => ...
route-table arlrt3 => ...
route-table arlrt3 => ...
最终我确信您可以使用python
实现这个简单的脚本