
私はログファイルからいくつかの例外を抽出し、いくつかの処理を行うシェルスクリプトプログラムを書いています。現在、私はスクリプトで以下のコマンドを使用して、例外があるログファイルの行番号をキャプチャしています。例外行には、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"