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

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

我试图在多个日志文件中的任何地方获取此模式(注意:这些模式的大小(即 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 

相关内容