在 Bash 中,您如何只读取日志中超过特定​​时间戳的行?

In Bash, How would you only read lines in a log past a certain timestamp?

所以现在我正在尝试执行以下操作:

grep "string" logfile.txt

一切顺利,但是 logfile.txt 中有很多 "string";我真的只想看看最后一小时的价值。在伪代码中我想做...

grep "string" logfile.txt  OnlyShowThoseInTheLastHour

有什么方法可以在 bash 中轻松完成此操作?在日志文件中,行如下所示:

13:27:50  string   morestuff morestuff morestuff

编辑:抱歉我忘了说,但是查看过去几天类似时间的日志不是问题,因为这些日志每天 refreshed/archived。

应该这样做:

awk 'BEGIN { tm = strftime("%H:%M:%S", systime()-3600) } /string/ &&  >= tm' logfile.txt

用您感兴趣的模式替换 string

它的工作原理是首先以 HH:MM:SS 格式构建一个包含 1 小时前时间信息的字符串,然后选择那些仅匹配 string 且第一个字段(时间戳)在字典序上更大的行大于或等于刚刚构建的时间戳字符串。

请注意,它有其局限性,例如,如果您在 00:30 执行此操作,则从 23:30 到 23:59 的日志条目将不匹配。通常,运行 此命令在 00:00 和 00:59 之间的任何时间都可能会忽略从 23:00 到 23:59 的日志条目。但是,这对您来说应该不是问题,因为您提到(在评论中)日志存档并在每个午夜重新开始。

此外,不处理闰秒,但这可能不是问题,除非您需要 100% 精确的结果。再次 - 由于日志在午夜重新开始,在您的特定情况下这根本不是问题。