我需要显示日志文件最后 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' | ..."
作为额外的好处,您无需阅读每张支票的整个日志。