私のシステム日付形式:
Thu Jun 13 12:55:18 EDT 2019
マイログ形式:
193.118.26.141 - - [01/May/2019:00:08:49 -0400] "GET / HTTP/1.1" 200 27
最後の5分間のログを取得する方法を教えてください。
ベストアンサー1
多くのテキスト処理と時間操作が必要なため、この操作はを使用して実行する必要がありますが、作業にはawk
まだ外部コマンドが必要です。date
次のawk
プログラム(私たちと呼ばれるparse_log_range.awk
)が動作します:
#!/bin/awk -f
BEGIN{
"date +%s" | getline now
close("date +%s")
}
{
n=match($0,/\[[^]]+\]/)
tst=substr($0,n+1,RLENGTH-2)
gsub(/\//," ",tst) # replace all '/'
sub(/:/," ",tst) # replace first ':'
cmd="date +%s -d \"" tst "\""
cmd | getline tst_s; close(cmd)
if (now-tst_s<max_age) print
}
最初は、date +%s
シェルでコマンドを実行して現在時刻を照会し、それを変数に保存しますnow
。
ログファイルの各行に対して、以下が実行されます。
- タイムスタンプを中間要素として抽出
[ ... ]
- 形式を理解しやすくするには、
/
まず削除してください。:
date
- タイムスタンプを「エポック以降の秒」に変換するシェルコマンドを作成します。
date +%s -d edited timestamp
- シェルでこのコマンドを実行し、結果を変数として読み込みます。
tst_s
max_age
次に、タイムスタンプがFarより小さいことを確認してくださいnow
。指定する必要がある時間範囲はどこmax_age
ですか(例:5分= 300秒)。
実行コマンドは
awk -v max_age=300 -f parse_log_range.awk logfile.txt