顯示過去 10 分鐘內日誌中具有特定模式的行

顯示過去 10 分鐘內日誌中具有特定模式的行

我需要顯示日誌檔案最後 10 分鐘內發生錯誤的行。

Aug 26 10:50:42 Normal line.
Aug 26 10:51:23 Normal line.
Aug 26 10:55:33 Error line.
Aug 26 10:56:45 Normal line.
Aug 26 10:58:12 Error line.
Aug 26 11:02:31 Normal line.
Aug 26 11:03:32 Normal line.
Aug 26 11:04:11 Normal line.

假設上面的日誌檔案範例。我只想顯示以下兩行

Aug 26 10:55:33 Error line.
Aug 26 10:58:12 Error line.

我正在使用 AIX。

答案1

向 Stéphane Chazelas 的兩個答案致敬:

我提出了一個暴力解決方案,循環遍歷過去 10 分鐘內每個可能的時間戳條目:

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%(%b %d %H:%M:%S)T\n' "$i seconds ago")
  grep "^${d} Error" logfile
done

它是暴力破解,因為它呼叫grep(以及內建的 printf)601 次。它需要支援 printf 選項的 ksh93%T來列印(和格式化)任意時間戳記。不過,由於存在以下邊緣情況,這比自己進行日期數學更容易:

  • 日界限
  • 月份界限
  • 可能的夏令時變化

答案2

這裡有一個可能性,無恥地抄襲@Jeff Schaller 的解決方案。單次調用grep,所以可能會快一點。

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%s|%(%b %d %H:%M:%S)T' "${d}" "${i} seconds ago")
done
grep -E "^(${d:1}) Error" logfile

答案3

感謝您的所有回复,我使用以下命令完成了所需的工作。

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' logfile

其中 d1 和 d2 已在上面初始化。為我做了這份工作。

乾杯。

答案4

如果您需要每 10 分鐘取得最後 10 分鐘的線路,您可以使用砍伐原木允許列印日誌檔案中看不見的尾部部分的工具。首先透過命令保存檔案位置

$ cutthelog logfile > /dev/null

然後透過 cron 作業處理日誌,例如

*/10 * * * * root cutthelog logfile | grep 'Error line' | ..."

作為額外的好處,您無需閱讀每張支票的整個日誌。

相關內容