如何用grep命令从日志文件提取HR:MIN MST格式的起止时间?
问题:使用grep从日志文件中提取作业的开始与结束时间
我正在通过程序生成如下格式的日志文件:
Job execution started 2018-05-16 05:54:08 MST Starting job for '2018-05-16' Starting job for '2018-05-16' Control table count is : '33768' Processing batch_id: '11548 11568 11598 11611 11637 11662 11688 Completed job for '2018-05-16' Job execution completed 2018-05-16 06:04:59 MST
我希望仅提取日志文件中的开始时间与结束时间,恳请指导如何使用grep命令实现该需求。
解决方案
很简单,我们可以利用grep的正则匹配功能精准定位包含开始和结束时间的内容,这里有几种不同的实现方式,你可以根据需求选择:
方式1:匹配完整的时间标记行
如果日志里开始时间固定跟着Job execution started,结束时间固定跟着Job execution completed,可以用这个命令提取带标记的完整时间信息:
grep -Eo 'Job execution (started|completed) [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [A-Z]+' your_log_file.log
命令说明:
-E:启用扩展正则表达式,支持用|匹配多个模式-o:只输出匹配到的内容,而非整行日志[0-9]{4}-[0-9]{2}-[0-9]{2}:匹配YYYY-MM-DD格式的日期[0-9]{2}:[0-9]{2}:[0-9]{2}:匹配HH:MM:SS格式的时间[A-Z]+:匹配时区(比如示例里的MST)
执行后会得到这样的输出:
Job execution started 2018-05-16 05:54:08 MST Job execution completed 2018-05-16 06:04:59 MST
方式2:仅提取纯时间字符串
如果只需要时间部分,不需要前缀标记,可以用正向预查断言来过滤掉前缀:
grep -Eo '(?<=Job execution (started|completed) )[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [A-Z]+' your_log_file.log
命令说明:
(?<=...):正向预查断言,匹配前面有指定内容但不包含该内容的部分,这样就能只提取时间字符串
执行后输出会是:
2018-05-16 05:54:08 MST 2018-05-16 06:04:59 MST
方式3:处理单行日志(如示例中的情况)
如果你的日志是单行格式,上面的命令依然有效,也可以直接通过管道传递单行内容测试:
echo "Job execution started 2018-05-16 05:54:08 MST Starting job for '2018-05-16' Starting job for '2018-05-16' Control table count is : '33768' Processing batch_id: '11548 11568 11598 11611 11637 11662 11688 Completed job for '2018-05-16' Job execution completed 2018-05-16 06:04:59 MST " | grep -Eo 'Job execution (started|completed) [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [A-Z]+'
如果日志格式有细微调整,你可以根据实际情况微调正则表达式的匹配规则。
内容的提问来源于stack exchange,提问作者Saurabh Deotale
相关产品推荐
相关产品推荐

