如何跨多个文件执行多行grep?

bla*_*arg 5 regular-expression pcregrep

我试图抓住这个模式出现在多个日志文件中的任何地方(注意:这些模式的大小可能有很大差异,即 Blahs 的数量):

   Found an txt File
    Blah
    Blah
    10019874
    Blah
    Blah
    Processed File   
Run Code Online (Sandbox Code Playgroud)

使用此命令行:

 pcregrep -M 'Found an.*(\n|.)*10019874.*(\n|.)*Processed' log_*.txt
Run Code Online (Sandbox Code Playgroud)

我的正则表达式在这里检查正则表达式

我正在使用带有 -M 多行标志的 pcregrep。它将出现在以“log_”开头并以“.txt”结尾的任何日志文件中。当我运行此命令时,它返回“分段错误”

有没有更简单/更好的方法来做到这一点?

ter*_*don 4

正如我在评论中所说,您发布的命令在我的 LMDE 上运行良好(pcregrep 版本 8.31 2012-07-06)。但是,由于您的正则表达式仅指定您要查找的字符串的一部分,因此您也可以使用 normal 来执行此操作grep:

grep -A 6 'Found an' log_*.txt | grep -C 3 10019874
Run Code Online (Sandbox Code Playgroud)

将-A 6打印与传递的字符串匹配的行和随后的 6 行,并将打印周围的-C 33行。最终结果与您使用的方法完全相同。pcregrep


如果您的模式可以具有不同的行数,则可以解释段错误。据推测,在某些文件中,匹配的部分太长并导致内存不足错误。解决这个问题的一种方法是编写一些脚本:

grep -A 6 'Found an' log_*.txt | grep -C 3 10019874
Run Code Online (Sandbox Code Playgroud)

与单衬垫相同:

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 
Run Code Online (Sandbox Code Playgroud)