如何在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;
我认为这实际上应该有效,它与我的第二行相同,除了表达式而不是块。但也许您想要||
而不是&&
?