私のログファイル(log.txt)が次のようになっているとしましょう。
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....
このファイルを追跡して過去のログを表示し、追跡を続行したいと思います。
つまり
tail <some magic to specify last 1 hour> -f log.txt
その後、出力は次のようになります。
2014-01-01 21:30:41 something happened....
...
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....
これを行うツールはありますか?
答え1
onelinerではgrepとtailの組み合わせを使用できます。
grep "2014-01-01 21:" log.txt; tail -f log.txt
その時間から始めて、すべての内容を印刷し続けます。
または、awkを使用して、特定の時間の開始からファイルの終わりまですべての内容を印刷し、その後も追跡を続けることができます。これにより、必要に応じて過去数時間を追跡できます。
awk '/2014-01-01 21:/' log.txt; tail -f log.txt
答え2
onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S")
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"
sed コマンドのない中間出力:
Aug 7 00:00:03 thinkpux CRON[25475]: pam_unix(cron:session): session closed for user stefan
Aug 7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session closed for user root
Aug 7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 7 00:19:33
Aug 7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug 7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)
出力:
Aug 7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug 7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)
注:最初に、日付を「+b%e%H:%M:%S」として設定しました(%bと%eの間のスペースに注意してください。しかし、echoは2つのスペースを1つに圧縮します。sedで検索することは次のとおりです。2つのスペースがあり、式がないため、月の日付が2桁か1桁かを区別するのは複雑ですが、ソートは追加/欠落したスペースに関係なく、圧縮を防ぐためのbashスイッチがあります。できますが、日付形式が異なるため、影響を受けませんが、どういうわけかこのアプローチをテストする必要があり、学習者も同じトラップに陥ることがあります。
したがって、一般的なアイデアは、1時間前の日付/時刻を取得し、ログファイルのようにフォーマットし、ログファイルに純粋な日付を追加し、混合物をソートしてから、sedを使用して純粋な日付より前のエントリを削除することです。コンテンツ。
覚えて入力するのは面白くありませんが、スクリプトや関数に入れることができます。
答え3
答え4
grep
orの問題awk
は、常にファイル全体を読み、各行を確認する必要があることです。- 問題
tail
は、どのくらいの行が必要かわからないということです。
だから試してみtac
てawk
くださいtail -f
。-n0
tac file \
| awk -F'[- :]' -v datefilter="$(date -d -1hour +%s)" 'mktime($1 OFS $2 OFS $3 OFS $4 OFS $5 OFS $6) < datefilter {exit} 1' \
| tac
tail -f -n0
(2つのコマンドの間に新しい行があると、その行を失う可能性があります。)