次のエントリを含む巨大なログファイルaccess.logがあります。
192.11.111.111 - - [05/Mar/2021:00:00:02 +0100] "GET ..."
192.250.14.80 - - [05/Mar/2021:00:00:09 +0100] "GET ..."
12.249.66.42 - - [05/Mar/2021:00:00:13 +0100] "GET ..."
過去の時間だけを取得またはフィルタリングする方法は?
ベストアンサー1
#!/bin/bash
age() { python -c '
import sys
from datetime import datetime
print(int((datetime.now() - datetime.strptime(sys.argv[1], sys.argv[2])).seconds))
' "$@"
}
tac access.log | while IFS= read line; do
date=$(cut -d' ' -f4 <<< "$line")
age=$(age "$date" "[%d/%b/%Y:%H:%M:%S")
[ $age -gt 3600 ] && break
printf '%s\n' "$line"
done
説明する:
- 私は日付文字列の年齢を取得する関数を作成するために
python
datetime
モジュールを使用しています。 - 次に、ファイルの行を逆方向に繰り返します。
tac log | while ...
- 日付文字列を取得するために使用します
cut
。-d' '
区切り文字が空白以外のタブの場合は、削除する必要があります。- または
awk '{print $4}' <<< "$line"
代わりに使用 - または
read ip some thing date tz else <<< "$line"
)を使用してください。
- 最初のステップで定義した関数を使用して年齢を取得します。
- 秒> 3600(= 1時間)の場合はループを停止します(
break
)。 - それ以外の場合は、その行を印刷します(または何でもします)。
いくつかの追加の注意:
タイムゾーン(+0100)を無視しているので、ここではログファイルと同じタイムゾーンにあるとします。異なる時間帯にログファイルがある場合は、この機能を改善できます
age
。ねえ日付をに読みますcut -d' ' -f4,5
。明らかに を使用して完全な操作を実行できますが、ファイル全体を読み込むことなく、
python
ファイルを逆順に読み取ることができます。それほど簡単ではないようです。私はとても良いですtac
。date
年齢を計算するには、bc
などを使用できます(ここでやったように)、しかし、日付形式はデフォルトでサポートされていないので、これは痛いでしょう。子ども、datetime.strptime
ぴったりです。この機能の利点は、
age
あらゆる種類の作業に再利用できることです。ちょうど同じことを呼んでstrptime
読むことができます。ここに録音してください。age "date_string" "format"