
次のログファイルがあり、継続的に記録されます。
2021-08-12 16:09:17 textsp sdgg
reponse:success
prams:invalid
2021-08-12 16:10:17 textdfdfdlfs sfdfs
reponse: failed
prams:valid
5分前のログを取得するスクリプトを作成したいと思います。しかし、まだ分からない。ラインには応答パラメータが含まれており、ベビーカーには時間がないため、フィルタリングが困難です。この事件についてどう思いますか?
答え1
GNUを使用すると、date
次awk
のことができます。
START=$(date -d '5 minutes ago' +'%F %T') \
LC_ALL=C awk '
/^[0-9]{4}(-[0-9]{2}){2}/ && $0 >= ENVIRON["START"], 0
' < file.log
awk 'start, end {action}'
開始範囲と終了範囲内の行で実行するためにジョブを使用しますが、ここではジョブは指定されず、デフォルトでは行0(意味)が印刷されます。間違った)を終了条件として使用し、タイムスタンプのように見え、5分前のタイムスタンプより大きいもので始まる最初の行で始まります。
2つのタイムスタンプ間のログの場合:
START=$(date -d '15 minutes ago' +'%F %T') \
END=$(date -d '5 minutes ago' +'%F %T') \
LC_ALL=C awk '
match($0, /^[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2}/) {
timestamp = substr($0, RSTART, RLENGTH)
if (timestamp > ENVIRON["END"]) exit
if (timestamp >= ENVIRON["START"])
started = 1
}
started' < file.log
これは、ログエントリが時系列でソートされていると仮定します。いつもそうではありません。たとえば、タイムスタンプはジョブの開始を示しますが、ログエントリはジョブの最後に追加され、一部のサーバーソフトウェアは複数のジョブを同時に実行します。