スクリプトで最後の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そのデータを読み取ります。

答え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>

関連情報