如何跨多個檔案執行多行 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 

相關內容