現在のタイムスタンプから30分前のログを抽出したいと思います。以下のスクリプトを開発しましたが、正しく動作しません。タイムスタンプ付きの行のみを表示し、タイムスタンプ付きの行間にタイムスタンプが指定されていないログ行を取得する必要があります。次のパターンを含むログファイルがあります。
スクリプト:
awk -v TSTART="$(date -v -30M "+%Y-%m-%d %H:%M")" -v TEND="$(date "+%Y-%m-%d %H:%M")" '$0>=TSTART && $0<=TEND' webservice_logs.log
ログファイルモード:
答え1
最初のフィールドが日付フィールドの場合にのみ設定されるフラグに基づいて行を印刷できます。p
awkに行を印刷(when p==1
)またはスキップする(when p==0
)指示するフラグを持つ次のコードを参照してください。
awk -v tstart="$start" -v tend="$end" '
/^[0-9]{4}-[0-9]{2}-[0-9]{2}/ {
t = $1 " " $2
p = t >= tstart && t <= tend ? 1 : 0
}p' webservice_logs.log
ERROR行の先頭にはタイムスタンプがないため、この行にフラグの変更はありません。
編集する一行で:
awk -v tstart="$start" -v tend="$end" '/^[0-9]{4}-[0-9]{2}-[0-9]{2}/{t = $1 " " substr($2,1,5); p = t >= tstart && t <= tend ? 1 : 0}p' webservice_logs.log
答え2
あなたはこれを試すことができます
awk -vStartDate=`date -d'now-30 min' +%H:%M:%S` '{ if ($2 > StartDate) print $0}' web.log