从日志文件获取所有符合时间条件的行

时间:2018-10-17 22:13:10

标签: unix grep tail

这是我的日志文件的样子

[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:05","k":"7322","h":"178","s":-53.134575556764}
[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:06","k":"2115","h":"178","s":-53.134575556764}
[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:07","k":"1511","h":"178","s":-53.134575556764}

有多个条目相似的日志文件,它们每秒更新一次。

这里"t" : "20:50:05"是时间。

我要做的是,从文件末尾获取所有文件在特定时间之间的所有日志。

我尝试使用tail files*.log | grep -e "20:50:07 | 20:50:05",但它不返回任何内容。

从所有日志文件的文件末尾开始,如何获取给定时间之间的所有日志条目?

1 个答案:

答案 0 :(得分:0)

如果您正在寻找记录范围,并且行的格式是一致的,则最简单的方法可能是隔离时间字段,去除冒号并利用算术运算符的功能。

单线awk解决方案,例如:

tail files*.log | awk -v from="205006" -v to="205007" -F"\"" '{ timeasint=$4; gsub(":","",timeasint); if (timeasint >= from && timeasint <= to) print $0 }'

将帮助您:

[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:06","k":"2115","h":"178","s":-53.134575556764}
[BCDID::16 T::LIVE_ANALYZER GCDID::16] {"t":"20:50:07","k":"1511","h":"178","s":-53.134575556764}

当然您不能跨越午夜(即25:59:59-00:00:01),但是为此,无论如何您都需要日期和时间在日志中。

如果您日期,我的建议是将它们转换为时代邮票(使用date -d“ string”或其他合适的方法),然后将时代邮票比较为整数。