ログファイルからいくつかの例外を抽出し、いくつかの処理を実行するシェルスクリプトを作成しています。現在、スクリプトで次のコマンドを使用して、例外が発生したログファイルの行番号を取得しています。例外行には、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
ERROR
sumという単語を含む行を取得するには、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"