1

1日に何百万行もあるログを取得し、(開始および終了タイムスタンプに基づいて)行の範囲を別のファイルに簡単にダンプする方法を見つけようとしています。ログがどのように構成されているかを示すために、ログからの抜粋を次に示します。

00:04:59.703: <abcxyz,v1 from YYY::Process at 14 Nov 2012 07:04:59>
00:04:59.703: 20121114070459 - XXX - 7028429950500220900257201211131000000003536
00:04:59.703: </abcxyz,v1>
00:04:59.711: <abcxyz,v1 from YYY::Process at 14 Nov 2012 07:04:59>
00:04:59.711: 20121114070459 - XXX - 7028690080500220900257201211131000000003538
00:04:59.711: </abcxyz,v1>
00:04:59.723: <abcxyz,v1 from YYY::Process at 14 Nov 2012 07:04:59>
00:04:59.723: 20121114070459 - XXX - 7028395150500220900257201211131000000003540
00:04:59.723: </abcxyz,v1>
00:04:59.744: <abcxyz,v1 from YYY::Process at 14 Nov 2012 07:04:59>

ご覧のとおり、ミリ秒ごとに複数の行があります。私がやりたいことは、開始と終了のタイムスタンプを入力として与え 、その範囲内のすべての行をダンプ させることができるようbegin=11:00:にすることです。end=11:45:

私はこれを理解しようと頭を悩ませてきましたが、これまでのところ満足のいく結果には至っていません。

更新:もちろん、質問を投稿した後に最初に試したことがうまくいくようです。ここに私が持っているものがあります:

sed -n '/^06:25/,/^08:25:/p' logFile > newLogFile

より良い方法があれば、提案を喜んでお受けします。

4

2 に答える 2

0

次のワンライナーを使用できます。

awk -v start='00:04:59.000' -v end='00:04:59.900' \
  '{if(start <= $1 && end >= $1) print $0}' < your.log > reduced.log

startおよび範囲の完全な形式に注意してください。endこれは単純にするためであり、IMO ではあまり問題になりません。

于 2012-11-16T10:48:19.397 に答える
0

あなたの sed oneliner はこのタスクには問題ないと思います。

に加えて、速度を最適化して(ファイルに数百万行あることを考慮して)、目的のブロックが印刷されたときに sed スクリプトを終了できます(ファイルに時間のブロックが繰り返されていないと仮定します)。

sed -n '/^06:25/,/^08:25/{p;/^08:25/q}' logFile > newLogFile

これは、ブロックの最後の行が見つかったときに終了するように sed に指示します。

于 2012-11-16T20:18:57.070 に答える