显示过去 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' | ..."

作为额外的好处,您无需阅读每张支票的整个日志。

相关内容