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:andend=11:45:并让它转储该范围内的所有行。

我一直在绞尽脑汁想弄清楚这一点,但到目前为止还没有得出令人满意的结果。

更新:当然,我发布问题后尝试的第一件事似乎有效。这是我所拥有的:

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

如果有更好的方法,非常乐意接受建议。

4

2 回答 2

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

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 回答