特定の時間に特定の種類の行を記録する必要がありますgrep
。どんなアイデアがありますか?
私の作業スクリプトは次のとおりです。
cat *.log |grep -E '2011-06-30 (1[0-1]:[0-1][0-5]|10:16)'| grep -ach '0110 478655 .. 51' * | awk '{SUM += $1} END { print SUM }'
上記路線の勤務時間は00:00~00:16です。grep
特定の時間に関するすべての結果を要約する必要があります。文字列をどのように連結しますかgrep
?
00:15-00:31, 00:30-00:46, 00:45-01:01
時間も可変でなければなりません。つまり、常に00:00-01:01にはなりません。これを行う方法はありますか?
答え1
正規表現を使用して時間を一致させることができますが、これは操作に最適なツールではありません。すべてのロジックをawkに入れ、数値比較を実行します。
Awkには日付を操作するための特定のツールはありません。 GNU awkはとmktime
拡張strftime
機能を提供します。指定された問題の場合、これらの拡張は必要ありませんが、要件がより複雑になると便利です。
あなたが提供した「作業」スクリプトは、おそらくあなたが書こうとしていたものではありません。 2番目のgrep
呼び出しはファイル名を引数(*
)として使用するため、標準入力からは読み取られません。また、サンプル入力も表示されません。だから私はあなたの要件が何であるかわかりません。
以下は、すべてのログ行が日付で始まり、すべてのログファイルで一致する行の末尾に表示される数値を合計したいと想定するいくつかのサンプルコードです。と変数に日付を渡し、に開始時刻を渡します。year
スニペットは15分以内にログエントリを取得するため、他の日付に展開することはできません。month
day
hour
minute
awk -vyear=2011 -vmonth=6 -vday=30 -vhour=0 -vminute=15 -vRS='[-: ]+' '
BEGIN {start = hour * 60 + min; stop = start + 15}
{time = $4 * 60 + $5}
$1==day && $2== month && $3==day && start <= time && time <= stop && $NF ~ /^[0-9]+$/ {
sum += $NF
}
END {print sum}'