保留全局匹配组

时间:2012-11-30 11:55:55

标签: regex perl

我正在编写一个脚本,以便在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:它们总是引用与正则表达式匹配的最后一行的编号组。 / p>

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

如果在全局匹配运行时没有办法保存这些组,或者之后从阵列中检索它们,我可能不得不放弃全局匹配,而是迭代在线为了将组保存到多维数组。在这种情况下,我几乎想要先将netstat传递给grep ......

1 个答案:

答案 0 :(得分:1)

尝试将foreach更改为while,以便您一次迭代匹配,而不是一次创建所有匹配。

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