
ログ ファイルの最後の 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' | ..."
追加の利点として、チェックごとにログ全体を読む必要がなくなります。