ログファイル内の例外行の行番号を見つける

ログファイル内の例外行の行番号を見つける

私はログファイルからいくつかの例外を抽出し、いくつかの処理を行うシェルスクリプトプログラムを書いています。現在、私はスクリプトで以下のコマンドを使用して、例外があるログファイルの行番号をキャプチャしています。例外行には、ERROR日付とタイムスタンプの直後にキーワードが含まれます。

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

現在のスクリプトをテストしているときに、一部のログ エントリに同じ行に ERROR と Exceptions が含まれていることに気付きました。これは、実際に探している種類の ERROR ではありません (例の行 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

ERRORおよび という単語を含む行を取得したい場合は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"

関連情報