継続的に追加される出力ログファイルがあり、出力ログから最後の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
そのデータを読み取ります。
答え2
#!/bin/bash
#To get previous 5 minutes logs from now(IST)
d1=$(date –date="-5 min" +'%Y-%m-%d %H:%M:%S.%3N')
d2=$(date +'%Y-%m-%d %H:%M:%S.%3N') #Added missing closing parenthesis
awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' /var/log/<file_name > > /var/log/$<new_file_name>