ログファイルで、異常な行の行番号を探します。

ログファイルで、異常な行の行番号を探します。

ログファイルからいくつかの例外を抽出し、いくつかの処理を実行するシェルスクリプトを作成しています。現在、スクリプトで次のコマンドを使用して、例外が発生したログファイルの行番号を取得しています。例外行には、ERROR日付とタイムスタンプの後にキーワードが含まれています。

lineNos=($(grep -n ERROR $file | grep Exception | cut -d':' -f1 | tail -3))

現在のスクリプトのテスト中に、一部のログエントリに同じ行にエラーと例外が含まれていることがわかりましたが、これは実際に私が探しているエラーの種類(例5行)ではないので、私のスクリプトを次のように修正したいと思います。以下の例のログの3行のみが返されます。

2016-10-21 15:25:37,231 INFO Processinng current row  
2016-10-21 15:25:37,231 INFO com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 ERROR com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 DEBUG com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 DEBUG Processing row with ERROR and Exception 
2016-10-21 15:25:37,231 DEBUG processed row 1: 

答え1

ERRORsumという単語を含む行を取得するには、Exception次のようにします。

grep -E "ERROR.*Exception" $file

答え2

awk代わりにを使用すると、行番号grepだけでなく(より正確には記録的な数字)直接テストするだけでなく、スペースで区切られた特定のフィールドを個別にテストすることもできます。

awk '$3 == "ERROR" && /Exception/ {print NR}' logfile

または(より具体的には -Exception最後の一致に限定)

awk '$3 == "ERROR" && $NF ~ /Exception/ {print NR}' logfile

答え3

cat thelogfile.log | nl -ba | grep "ERROR"

これはファイルをnlで番号付けされた行にパイプし、次にgrepを使用してエラー行をフィルタリングします。エラー行番号だけが必要な場合は、awk '{print $1}'を追加してください。 catは行番号に-nフラグを使用することもできますが、私はnlを好みます。

無効な行番号配列変数の例。

linenos=($(cat -n thelogfile.log | grep "ERROR" | awk '{print $1}' | tr "\n" " " | sed 's/$/\n/'))

編集する:

ちょうどps grep;

grep ",[0-9]* ERROR"

答え4

より具体的な正規表現を使用してください。

grep '^[0-9, :-]\+ERROR' "$file"

関連情報