スクリプトで最後の5分間のログを取得しようとしています。

スクリプトで最後の5分間のログを取得しようとしています。

継続的に追加される出力ログファイルがあり、出力ログから最後の5分間のデータを取得するスクリプト(5分ごとに実行)を持つ予定です。

出力ログファイルのサンプルデータ:

2015-10-29 09:19:39,630 INFO line1 of log  
2015-10-29 09:21:39,630 INFO line2 of log
2015-10-29 09:22:39,630 INFO line3 of log
2015-10-29 09:23:39,630 INFO line4 of log
2015-10-29 09:24:39,630 INFO line5 of log
2015-10-29 09:25:39,630 INFO line6 of log

09:25にスクリプトを実行すると、最後の5行をキャプチャして別の出力ファイルに送信する必要があります。

ベストアンサー1

これがあなたに必要なものです:

five_min=$( date -d "5 minutes ago" +"%F %T" )
while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done < output.log

だからこれは巨大なファイルです。次に、tac下からファイルを出力するために使用します。

five_min=$( date -d "5 minutes ago" +"%F %T" )
tac output.log | while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done | tac

他の言語と同様に、このwhileコマンドは条件がtrueのときに本文を実行します。 POSIXシェルでは、ifandコマンドの「条件」while自体がコマンドです。 「条件」の「真実」は、命令が終了状態0で終了することである。[andという単語が[[単純な構文(bashシェル型help [[とのhelp [)ではなく、実際にコマンドであることを認識することは非常に重要です。

この回答の条件は、IFS= read -r lineこれがファイルから行を読み取り、すべてのスペースとバックスラッシュシーケンスをそのまま維持する標準的な方法です。read入力ストリームから読み取る内容がなくなった場合は、ゼロ以外の終了ステータスが返されます。最初の応答では、ログファイルの内容をコマンドの標準入力にリダイレクトwhileし、readそのデータを読み取ります。

おすすめ記事