2012-11-30 43 views
1

我正在编写脚本以在Linux的netstat命令上执行一些基本的正则表达式匹配。我的正则表达式正常工作,并以五组的方式获得我想要的列:协议和两对IP地址和端口号。在全局匹配上保留组

然后我在我的正则表达式对运行netstat的产量在全球的比赛和整个结果数组迭代打印在数列中的信息:

my $content = `netstat -na`; 
my $REGEX = '([a-z]*) +.* (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}) +(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}).*ESTABLISHED'; 
foreach ($content =~ m/$REGEX/g) { 
    printf ("%-10s%-18s%-10s%-18s%-10s\n", $1, $2, $3, $4, $5); 
} 

然而,这并没有得到我想要的结果,因为它只打印最后一个匹配线几次。我花了很长时间才发现我错误地使用了数字变量$1$5:它们总是引用与正则表达式匹配的最后一行的编号组。

这现在给我留下了一个问题:我想使用我在原始正则表达式中定义的组和全局匹配返回的行。这是完全可能的还是全局匹配只是一种执行grep-like操作的方式?

如果在全局匹配运行时没有办法保存这些组,或者之后从数组中检索它们,我可能不得不放弃全局匹配,而是遍历行以便保存组到一个多维数组。在这种情况下,我几乎想只是管netstatgrep第一...

+0

你应该看看是否有这个模块。有一个名为['Parse :: Netstat'](http://search.cpan.org/perldoc?Parse%3A%3ANetstat)可能适合您的需求。 – TLP

+0

一个很好的建议,但在这种情况下,我使用'netstat'的事实更能说明问题。这是一系列初学者正则表达式练习的一部分,所以我对这个过程比结果更感兴趣。 – Lilienthal

+1

简短的故事是,你不能在列表上下文中使用具有'/ g'修饰符的捕获组。但是,您可以使用标量上下文,并使用“while”而不是“for”。 – TLP

回答

1

尝试改变foreachwhile,让你通过比赛迭代一个的时候,而不是一次创建所有的比赛。

while ($content =~ m/$REGEX/g) { 
+0

完美地工作。并感谢澄清上述评论中的问题。 – Lilienthal

+0

不客气。 – TLP