2012-11-15 88 views
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 

如果有更好的方法,很乐意采取建议。

+0

什么是语言? – inhan

+1

'sed'本来是我的第一个解决方案。我认为你不会找到任何更快捷的事情。 – MattH

回答

0

我觉得你的sed oneliner是好的任务。

除了,您可以优化速度(考虑文件有数百万行),当打印所需的块时(假设文件中没有重复的时间块)退出sed脚本。

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

这告诉sed在块的最后一行被找到时退出。

+0

感谢您添加命令。 – ssbsts

+0

@ user1804896非常欢迎。干杯。 –

0

您可以使用下面oneliner:

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

通知startend范围内的全格式 - 这是保持它的简单,并没有太大的问题,IMO