我正在编写脚本以在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操作的方式?
如果在全局匹配运行时没有办法保存这些组,或者之后从数组中检索它们,我可能不得不放弃全局匹配,而是遍历行以便保存组到一个多维数组。在这种情况下,我几乎想只是管netstat
到grep
第一...
你应该看看是否有这个模块。有一个名为['Parse :: Netstat'](http://search.cpan.org/perldoc?Parse%3A%3ANetstat)可能适合您的需求。 – TLP
一个很好的建议,但在这种情况下,我使用'netstat'的事实更能说明问题。这是一系列初学者正则表达式练习的一部分,所以我对这个过程比结果更感兴趣。 – Lilienthal
简短的故事是,你不能在列表上下文中使用具有'/ g'修饰符的捕获组。但是,您可以使用标量上下文,并使用“while”而不是“for”。 – TLP