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