過去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
(内蔵printfとともに)601回呼び出すので無差別攻撃です。%T
ランダムなタイムスタンプを印刷(およびフォーマット)するには、printfオプションをサポートするksh93が必要です。しかし、次のような極端なケースのために、日付計算を直接実行するよりも簡単です。
- 日限定
- 月限度
- 可能な夏時間の変更
答え2
@Jeff Schallerの解決策を曖昧に盗む可能性があります。シングルコール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' | ..."
追加のボーナスで、各スキャンのログ全体を読む必要はありません。