我试图在多个日志文件中的任何地方获取此模式(注意:这些模式的大小(即 Blahs 的数量)可能会有很大差异):
Found an txt File
Blah
Blah
10019874
Blah
Blah
Processed File
使用此命令行:
pcregrep -M 'Found an.*(\n|.)*10019874.*(\n|.)*Processed' log_*.txt
我的正则表达式检查出来正则表达式在这里
我将 pcregrep 与 -M 多行标志一起使用。它将出现在以“log_”开头并以“.txt”结尾的任何日志文件中。当我运行此命令时,它返回“分段错误”
有没有更简单/更好的方法来做到这一点?
答案1
正如我在评论中所说,您发布的命令在我的 LMDE 上运行良好(pcregrep 版本 8.31 2012-07-06)。但是,由于您的正则表达式仅指定您要查找的字符串的一部分,因此您也可以使用 normal 来执行此操作grep
:
grep -A 6 'Found an' log_*.txt | grep -C 3 10019874
将-A 6
打印与传递的字符串匹配的行以及随后的 6 行,并将-C 3
打印 3周围线。最终结果与pcregrep
您使用的方法完全相同。
如果您的模式可以具有不同的行数,则可以解释段错误。据推测,在某些文件中,匹配的部分太长并导致内存不足错误。解决这个问题的一种方法是编写一些脚本:
perl -ne '$c=1 if /Found an/; ## set $c to 1 if this line matches 'Found on'
if($c){ ## If $c is defined and non-0
push @F,$_; ## Add the current line to the @F array
$c++ if /10019874/; ## Increment $c if this line matches '10019874'
if(/Processed/){ ## If this line matches 'Processed'
print "@F" if $c>1; ## Print the contents of @F if $c is >1
@F=""; $c=0; ## Empty @F, set $c to 0.
}
}' log_*.txt
与单衬垫相同:
perl -ne '$c=1 if /Found an/; if($c){push @F,$_; $c++ if /10019874/; if(/Processed/){print "@F" if $c>1; @F=""; $c=0;}}' log_*txt