我想在系统日志中搜索大于特定搜索模式的日期。例如,我想找到日期大于的每个系统日志条目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::Parse
perl 模块:
<yourfile.log perl -MDate::Parse -ne '
BEGIN{$start = str2time("2021-01-06 16:24")}
print if str2time(substr($_, 0, 15)) >= $start'
对于无年份的日期,Date::Parse
sstr2time
似乎给出过去的日期,除非该日期来自当前月份。例如,如果在 2022 年 1 月 15 日运行,“Feb 2”将被解释为 2021-02-02,而“Jan 31”将被解释为 2022-01-31。