2

このようなログ ファイルがあり、日付範囲を取得しようとしています

"07/10/2013 01:31:54","SNMP" 

"07/10/2013 01:31:54","SNMP" 
.... ... .. 
"07/10/2013 03:03:54","SNMP"

私は awk コマンドを使用しています。すべての行が表示されます。別の組み合わせを試してみましたが、使用できませんでした。awk で使用する必要がある標準データ形式はありますか?

awk -F, '"07/10/2013 01:35:40" > $1&&$1 <= "07/10/2013 01:50:03"' Mylog.log | wc -l
4

2 に答える 2

3

CSV の解析日付の比較という 2 つの問題があります。

match()またはCSV 解析関数を使用して解決できる最初のもの。

ISO-8601のような適切な日付形式を使用することで解決できる2番目の問題は、日付(タイムゾーン/ DSTの変更など)を語彙的に比較できるという嬉しい副作用です。gawkプレーンの代わりに実際に使用している場合、awkまたはnawk組み込みの日付関数を使用してmktime()タイムスタンプを解析し、日付を数値的に比較できるエポック秒の序数を返すことができます。 awkにはネイティブの日付/時刻型がなく、標準のデータ/時刻ライブラリもないため、ここでは字句比較または数値比較が最も簡単なオプションです。

の最後のオプションgawkは、厄介なハックです。

/^"07.10.2013 01:35:40"/,/^"07.10.2013 01:50:03"/ {
    # your code here
}

これは、範囲式を使用して、一致の範囲を特定の行の間に制限します。これは、時間が単調に増加する限り、ファイル形式で機能するはずです – これはApache ログには当てはまりません(ログは完了順に記録されますが、デフォルトでは元の要求のタイム スタンプが含まれており、単調であることが保証されていないためです)。増加しています)。

于 2013-07-10T09:43:08.147 に答える
1

文字列比較:

$ awk -F" '"07/10/2013 01:35:40" > $2 && $2 <= "07/10/2013 01:50:03"' file
"07/10/2013 01:31:54","SNMP"
"07/10/2013 01:31:54","SNMP"
.... ... ..

...うまくいきそうです!時間を比較するには、 を使用することをお勧めしますmktime("YYYY MM DD HH MM SS")

于 2013-07-10T09:42:13.057 に答える