Sed

即使(日誌)文件中不存在搜尋模式,也僅顯示大於搜尋模式的日期

  • January 15, 2022

我想在系統日誌中搜尋大於特定搜尋模式的日期。例如,我想查找日期大於的每個 syslog 條目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

如果您的日誌被格式化為更有用的格式,例如:

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::Parse’sstr2time似乎給出過去的日期,除非日期來自目前月份。例如,如果在 2022 年 1 月 15 日執行,“Feb 2”將被解釋為 2021-02-02,而“Jan 31”將被解釋為 2022-01-31。

引用自:https://unix.stackexchange.com/questions/686478