Regex 日志中行的匹配范围

Regex 日志中行的匹配范围,regex,bash,sed,timestamp,logparser,Regex,Bash,Sed,Timestamp,Logparser,我正试图找出如何获取一个有数百万行的日志 一天,轻松地将一系列行(基于开始和结束时间戳)转储到 另一个文件。下面是日志的摘录,展示了它是如何构造的: 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: </a

我正试图找出如何获取一个有数百万行的日志 一天,轻松地将一系列行(基于开始和结束时间戳)转储到 另一个文件。下面是日志的摘录,展示了它是如何构造的:

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>

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

您可以使用以下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
awk-v start='00:04:59.000'-v end='00:04:59.900'\
“{if(start=$1)print$0}”reduced.log

请注意
开始
结束
范围的完整格式-这是为了保持它的简单性,并且不会给IMO带来太多问题

我认为您的sed oneliner适合这项任务

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


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

sed
将是我的第一个解决方案。我认为你找不到比这更容易的更快的了。
awk -v start='00:04:59.000' -v end='00:04:59.900' \
  '{if(start <= $1 && end >= $1) print $0}' < your.log > reduced.log
sed -n '/^06:25/,/^08:25/{p;/^08:25/q}' logFile > newLogFile