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 操作的方法?

如果在全局匹配运行时无法保存这些组或之后从数组中检索它们,我可能不得不放弃全局匹配,而是遍历行以将组保存到多维数组。在这种情况下,我几乎很想先netstatgrep...

4

1 回答 1

1

尝试更改foreachwhile,以便一次遍历一个匹配项,而不是一次创建所有匹配项。

while ($content =~ m/$REGEX/g) {
于 2012-11-30T12:22:24.810 回答