7

2つの日付範囲の間のすべての行をgrepしようとしています。ここで、日付は次のようにフォーマットされています:date_time.strftime( "%Y%m%d%H%M")したがって、[201211150821-201211150824]の間と言います。

これらの日付の間の行を探すことを含むスクリプトを書き込もうとしています。

cat <somepattern>*.log | **grep [201211150821 -  201211150824]** 

私は、日付の範囲を探すことができるUNIXに何かが存在するかどうかを調べようとしています。

ログの日付を(エポック以降)に変換してから、[time1 --time2]で通常のgrepを使用できますが、これは、各行を読み取り、時間値を抽出してから変換することを意味します。

単純なものがすでに存在している可能性があるため、grepに数値範囲を提供する方法で日付/タイムスタンプ範囲を指定できますか?

ありがとう!

PS:また、2012111511(27 | 28 | 29 | [3-5] [0-9])のようなパターンを渡すこともできますが、それは私が望む範囲に固有であり、毎回異なる日付で試すのは面倒です。実行時にそれを行うのは難しくなります。

4

5 に答える 5

2

Perl ソリューション:

perl -wne 'print if m/(?<!\d)(20\d{8})(?!\d)/
                      && $1 >= 201211150821 && $1 <= 201211150824'

( で始まる最初の 10 桁の整数を見つけ、20その整数が目的の範囲内にある場合は行を出力します。そのような整数が見つからない場合は、その行をスキップします。正規表現を微調整して、より多くの整数にすることができます。有効な月と時間などについて制限があります。)

于 2012-11-21T20:09:32.817 に答える
2

awk を使用します。行の最初のトークンがタイムスタンプであると仮定します。

awk '
BEGIN { first=ARGV[1]; last=ARGV[2]; }
$1 > first && $1 < last { print; }
' 201211150821 201211150824
于 2012-11-21T20:02:40.447 に答える
1

あなたはややあいまいな 'csplit' (コンテキスト分割) コマンドを探しています:

csplit '%201211150821%' '/201211150824/' ファイル

ファイルから最初と 2 番目の正規表現の間のすべての行を分割します。ファイルが日付でソートされている場合、最速かつ最短になる可能性があります(ログをgrepしていると言いました)。

于 2012-11-21T20:30:20.230 に答える
0

Bash + coreutilsのexprのみ:

export cmp=201211150823 ; cat file.txt|while read line; do range=$(expr match "$line" '.*\[\(.*\)\].*'); [ "x$range" = "x" ] && continue; start=${range:0:12}; end=${range:15:12}; [ $start -le $cmp -a $end -ge $cmp ] && echo "match: $line"; done

cmp比較値です、

于 2012-11-21T20:37:31.573 に答える