web-dev-qa-db-ja.com

ログ内の特定の期間をgrepする方法

次のような日付/時刻形式で始まる行エントリを持つログファイルを処理します。

20150408 13:29:28 <rest of text>

grepの日付範囲にするために何をする必要がありますか?

20150408 13:29:28で始まり20150408 17:55:02で終わるすべての行が好きですか?

grepは仕事のためのツールでしょうか、それともsedのような他のものが良いでしょうか?

5
user53029

Certanlyタスクはsedで実行できます

sed '/20150408 13:29:28/,/20150408 17:55:02/! d' log_files

ただし、行に正確な20150408 13:29:28がない場合、スクリプトは何も出力しません。正確な20150408 17:55:02がない場合、ファイルは最後まですべての行を出力します。したがって、スクリプトによる日付比較を使用する方が良いでしょう。

limit1=$(date -d "20150408 13:29:28" +"%s")
limit2=$(date -d "20150408 17:55:02" +"%s")
while read -r logdate logtime logline
do
    logsec=$(date -d "$logdate $logtime" +"%s")
    if [ $limit1 -le $logsec -a $limit2 -ge $logsec ]
    then
        echo $logdate $logtime $logline
    fi
done < log_files
4
Costas

awkが役立つと思います:

awk 'BEGIN { sd = "20150408T13:29:28"; ed = "20150408T17:55:02"; } $1 "T" $2 >= sd && $1 "T" $2 <= ed' log
3
taliezin