目的:サーバーは現在時刻から過去10分間のnginx api_access.logを出力します。
私が試す方法:
nginx api_access.logのタイムスタンプを現在の時刻と比較してから、過去10分間のログを印刷してみました。
使用されたコマンド:
awk -F'["+]' -v d1="$(date --date '-10 min' '+%FT%T')" -v d2="$(date '+%FT%T')" '
$4 > d1 && $4 <d2 || $4 ~ d2' api_access.log
Nginx api_access.log:
{"@timestamp":"2020-06-15T12:36:38+00:00","msec":1592224598.704,"remote_addr":xxx xxxx}
{"@timestamp":"2020-06-15T12:51:41+00:00","msec":1592225501.530,"remote_addr":xxx xxxx}
失敗する:
現在時刻を2020-06-15T12:36:38+00:00形式と比較できず、api_access.logから過去10分のログを印刷できません。
助けてください...
答え1
GNUを使用してawk
日付をタイムスタンプに変換します。
awk -v d1="$(date -d '-10 min' '+%s')" -v d2="$(date '+%s')" -F'[-":,T+]' '
{ ts=mktime($5" "$6" "$7" "$8" "$9" "$10) }
ts >= d1 && ts <= d2
ts > d2{ exit 0 }
' api_access.log
現在の日付のタイムスタンプより大きいタイムスタンプが見つかると、最後の行はすぐにスクリプトを終了します。