ログ内の特定のパターンを持つ過去 10 分間の行を表示します。

ログ内の特定のパターンを持つ過去 10 分間の行を表示します。

ログ ファイルの最後の 10 分間にエラーが発生した行を表示する必要があります。

Aug 26 10:50:42 Normal line.
Aug 26 10:51:23 Normal line.
Aug 26 10:55:33 Error line.
Aug 26 10:56:45 Normal line.
Aug 26 10:58:12 Error line.
Aug 26 11:02:31 Normal line.
Aug 26 11:03:32 Normal line.
Aug 26 11:04:11 Normal line.

上記のログファイルのサンプルを想定します。次の2行だけを表示したいです。

Aug 26 10:55:33 Error line.
Aug 26 10:58:12 Error line.

AIXを使用しています。

答え1

ここでの 2 つの回答については、Stéphane Chazelas 氏に敬意を表します。

私は、過去 10 分間のすべてのタイムスタンプ エントリをループするブルート フォース ソリューションを提案します。

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%(%b %d %H:%M:%S)T\n' "$i seconds ago")
  grep "^${d} Error" logfile
done

grepこれは、601 回 (および組み込みの printf)を呼び出すため、ブルート フォースです。%T任意のタイムスタンプを印刷 (およびフォーマット) するには、printf オプションをサポートする ksh93 が必要です。ただし、次のようなエッジ ケースがあるため、日付の計算を自分で行うよりも簡単です。

  • 日の境界
  • 月の境界
  • 夏時間の変更の可能性

答え2

ここでの可能性があるのは、@Jeff Schaller のソリューションを恥ずかしげもなく盗用することです。 を 1 回呼び出すだけなgrepので、おそらく少し速くなります。

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%s|%(%b %d %H:%M:%S)T' "${d}" "${i} seconds ago")
done
grep -E "^(${d:1}) Error" logfile

答え3

皆様のご回答に感謝いたします。次のコマンドで必要な作業を実行しました。

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' logfile

ここで、d1 と d2 は上記で初期化されています。私の場合はうまくいきました。

乾杯。

答え4

10分ごとに過去10分間のラインを取得する必要がある場合は、丸太を切るログファイルの見えない末尾部分を印刷できるツール。まずコマンドでファイルの位置を保存します。

$ cutthelog logfile > /dev/null

次に、cronジョブでログを処理します。例:

*/10 * * * * root cutthelog logfile | grep 'Error line' | ..."

追加の利点として、チェックごとにログ全体を読む必要がなくなります。

関連情報