
我需要顯示日誌檔案最後 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' | ..."
作為額外的好處,您無需閱讀每張支票的整個日誌。