我知道如何通过在perl脚本中的文件中搜索单个字符串来提取行,并且下面的命令工作得非常好,这使得行中包含255.255.255.255。
my @newList = grep /255.255.255.255/, @File1;
但是,当我想在文件中搜索多个字符串(字段)时,grep命令无法正常工作
我有下面的文件,如果sourceipaddress,destipaddr和端口号匹配,它应该提取整行并写入数组
gitFile:
访问abc permit tcp sourceipaddress sourcesubnet destipaddr destsubnet eq portnumber
这是我选择解决问题的方法,我根据字段进行拆分并使用grep在数组中搜索这些字段,但它似乎不起作用(尝试了5种不同的评论方式)下面但没有一个命令工作)。我只想要一种方法来搜索一行中的多个字符串(包括ipaddress)。因为我是perl的新手,所以我正在努力帮助。
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;
#my @gitLines = grep /255.255.255.255/ && /$fld0/, @File1;
我在Linux GNU / Linux风味中尝试这个
答案 0 :(得分:1)
如果没有完整的代码,则不清楚程序中发生了什么。我根据上下文推断$line
有一个行的模板,所以你从中提取模式,@gitFile
包含文件中的所有行。然后在这些行中你想要识别具有所有三种模式的那些。
首次尝试应写为
my @gitLines = grep { /$fld0/ && /$fld1/ && /$fld2/ } @gitFile;
虽然您可能确实选择了分隔符,但除//
以外的任何分隔符必须有m
,因此您可以拥有grep { m"$fld0" && .. }
(显式{{1}中没有值因为它只会增加噪音)。但我觉得在这种情况下使用不常见的分隔符只是模糊不清。
第二次尝试错误,因为您无法匹配数组。此外,即使只有一个模式匹配,使用替换$_
也会匹配。
另一种方法是形成一个正则表达式来解析行而不是在每个字段上单独匹配
|
应使用qr
operator构建正则表达式模式,但对于简单的my $re = join '.*?', map { quotemeta } (split ' ', $line)[3,6,9];
my @gitLines = grep { /$re/ } @gitFile;
模式,字符串可以正常工作。
这里的模式需要按照确切的顺序存在于一行中,与上面的.*?
不同。一个明显的优势是它在线上运行一次正则表达式,而在grep
中引擎启动三次。
请注意,通常最好逐行处理文件,除非有特定原因提前读取整个文件。例如
grep
除了效率之外,还有更容易维护的优势。
答案 1 :(得分:0)
基本上,我相信你试图在一行中找到超过1个匹配,并且你在一个名为@gitFile
的数组中得到了每一行。
按照我的理解,我试图以更简单的方式做到这一点。
$fld0 = 'pattern1';
$fld1 = 'pattern2';
foreach(@gitFile)
{
if(($_=~ m/$fld0/ && $_ =~ m/$fld1/))
{
push(@gitLines ,$_);
}
}