在 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% 精确的结果。再次 - 由于日志在午夜重新开始,在您的特定情况下这根本不是问题。
所以现在我正在尝试执行以下操作:
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% 精确的结果。再次 - 由于日志在午夜重新开始,在您的特定情况下这根本不是问题。