即使(日志)文件中不存在搜索模式,也仅显示大于搜索模式的日期

即使(日志)文件中不存在搜索模式,也仅显示大于搜索模式的日期

我想在系统日志中搜索大于特定搜索模式的日期。例如,我想找到日期大于的每个系统日志条目JAN 6 16:24:00。我知道我可以使用 sed ( sed -n '/JAN 6 16:24:00/,$p' ${LOGFILE}) 但这只有在存在我指定的确切日期的条目时才有效sed- 如果日志文件中没有包含完全包含 的条目JAN 6 16:24:00,我将不会得到任何输出,因为没有真正的逻辑,只有字符串正在被比较。

我知道,journalctl --since "XXX"但这可能会在不基于 SystemD 的主机上运行,​​但基本上我需要这个功能。

有没有办法使用“经典”GNU 工具打印日志文件中比X假设日志文件不包含的日期更新的所有条目?X

答案1

如果您的日志采用更有用的格式,例如:

2021-01-06 16:24:00 log text

你可以这样做:

awk '$0 >= "2021-01-06 16:24:00"'

但在这里,情况更加复杂,因为这些日期是使用英文月份名称缩写来格式化的,甚至没有指定年份。

最好是使用一个日期解析器,它可以理解时间戳格式,并将无年份时间戳理解为过去最近发生的时间戳,例如Date::Parseperl 模块:

<yourfile.log perl -MDate::Parse -ne '
  BEGIN{$start = str2time("2021-01-06 16:24")}
  print if str2time(substr($_, 0, 15)) >= $start'

对于无年份的日期,Date::Parsesstr2time似乎给出过去的日期,除非该日期来自当前月份。例如,如果在 2022 年 1 月 15 日运行,“Feb 2”将被解释为 2021-02-02,而“Jan 31”将被解释为 2022-01-31。

相关内容