如何使用 grep 命令在 perl 中搜索多个模式?

如何使用 grep 命令在 perl 中搜索多个模式?

如何在perl中使用grep命令搜索多个字段?

我有以下文件

文件1:

access abc permit tcp sourceipaddress sourcesubnet destipaddr destsubnet eq portnumber

在这里,我根据字段进行拆分,并在数组中查找这些字段,但它似乎不起作用(尝试了下面评论的 4 种不同方法,但没有任何效果)

 my @columns = split(' ',$line);
    my $fld0 = $columns[3];
    my $fld3 = $columns[6];
    my $fld5 = $columns[9];

    #my @gitLines = grep "$fld0" && $_ =~ "$sIP" && $_ =~ "$dIP" && $_ =~ "$fld5"} @gitFile;

  #my @gitLines = @gitFile =~ /$fld0|$sIP|$dIP|$fld5/;

#my @gitLines = grep /$fld0/ && /$sIP/ && /$dIP/ && /$fld5/, @gitFile;

#grep {$fld0} && {$sIP} && {$dIP} && {$fld5} @gitFile;

答案1

Perlgrep接受一个代码块(*)$_并给出与该块相关的数组元素。/pattern/隐式匹配$_,我们可以将模式匹配与&&or结合起来||。所以这些应该有效:

my @foo = qw/abc cde efg ghi/;
printf("%s\n", join(" ",  grep {/c/ || /e/} @foo));
printf("%s\n", join(" ",  grep {/c/ && /e/} @foo));

@foo第一个打印具有 或 的c元素,e第二个打印具有两者的元素。

(* 或表达式,但我发现块语法更清晰)


#my @gitLines = grep "$fld0" && $_ =~ "$sIP" && $_ =~ "$dIP" && $_ =~ "$fld5"} @gitFile;

您在这里缺少左大括号,并且"$fld0"它本身不会测试除 的内容之外的任何内容$fld0

#my @gitLines = grep /$fld0/ && /$sIP/ && /$dIP/ && /$fld5/, @gitFile;

我认为这实际上应该有效,它与我的第二行相同,除了表达式而不是块。但也许您想要||而不是&&

相关内容