複数のファイルで複数行のgrepを実行する方法は?

複数のファイルで複数行のgrepを実行する方法は?

複数のログファイル内のすべての場所からこのパターンを取得しようとします(注:これらのパターンのサイズ(たとえば、何が起こっているかなど)は大きく異なる可能性があります)。

   Found an txt File
    Blah
    Blah
    10019874
    Blah
    Blah
    Processed File   

次のコマンドラインを使用してください。

 pcregrep -M 'Found an.*(\n|.)*10019874.*(\n|.)*Processed' log_*.txt

私の正規表現で確認してください。ここで正規表現

私は -M 複数行フラグで pcregrep を使用します。 「log_」で始まり、「.txt」で終わるすべてのログファイルに表示されます。このコマンドを実行すると、「セグメンテーションエラー」が返されます。

これを行うより簡単でより良い方法はありますか?

ベストアンサー1

コメントで述べたように、投稿したコマンドは私のLMDE(pcregrepバージョン8.31 2012-07-06)でうまく機能します。ただし、正規表現は探している文字列の一部のみを指定するため、通常を使用してこれを行うこともできますgrep

grep -A 6 'Found an' log_*.txt | grep -C 3 10019874

-A 6渡された文字列と次の6行に一致する行を印刷し、3-C 3を印刷します。ワイヤー。最終結果はpcregrep使用した方法とまったく同じです。


スキーマの行数が異なる可能性がある場合、これはセグフォルトを記述できます。おそらく、一部のファイルでは、一致する部分が長すぎるため、メモリ不足エラーが発生しているようです。この問題を解決する1つの方法は、次のスクリプトを書くことです。

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 

おすすめ記事