継続的に追加される出力ログファイルがあり、出力ログから最後の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シェルでは、if
andコマンドの「条件」while
自体がコマンドです。 「条件」の「真実」は、命令が終了状態0で終了することである。[
andという単語が[[
単純な構文(bashシェル型help [[
とのhelp [
)ではなく、実際にコマンドであることを認識することは非常に重要です。
この回答の条件は、IFS= read -r line
これがファイルから行を読み取り、すべてのスペースとバックスラッシュシーケンスをそのまま維持する標準的な方法です。read
入力ストリームから読み取る内容がなくなった場合は、ゼロ以外の終了ステータスが返されます。最初の応答では、ログファイルの内容をコマンドの標準入力にリダイレクトwhile
し、read
そのデータを読み取ります。