搜索过去一小时的日志

搜索过去一小时的日志

我需要 bash 脚本来在日志中搜索失败和失败字词。但仅限于上一小时

cut -c 5- /var/log/mail.log | awk '($0 >= from)' from="$(LC_TIME=C date +'%_d %H:%M:%S' -d -1hour)" |grep -i 'Failed:\|failure'

示例日志文件

Nov  1 01:00:00 localhost pushmail[55555]: 666666666666: Failed 
Nov  2 15:00:00 localhost pushmail[55556]: 666666666666: Failed 
Nov  3 11:00:00 localhost pushmail[55557]: 666666666666: Failed 
Nov  3 12:00:00 localhost pushmail[55558]: 666666666666: Failed 
Nov  3 13:30:00 localhost pushmail[55559]: 666666666666: Failed 
Nov  3 13:40:00 localhost pushmail[55560]: 666666666666: Failed 
Nov  3 14:00:00 localhost pushmail[55561]: 666666666666: Failed 
Nov  3 15:00:00 localhost pushmail[55562]: 666666666666: Failed 
Nov 14 15:00:00 localhost pushmail[55563]: 666666666666: Failed 

我使用 cut 删除本地月份名称。但是当我在两天前的日志条目表单中看到它时,结果中却有它。

答案1

我能找到的最可靠的解决方案是:

while read -r rec
do   age=$(($(date +%s)-$(date -d "${rec:0:16}" +%s)))
     [ $age -ge 0 -a $age -le 3600 ] && \
     grep -Eiq 'failed|failure' <<< "$rec" && echo "$rec"
done </var/log/mail.log

它用于date将记录的时间转换为自 1970 年初以来的秒数,然后将其与当前时间的秒数值进行比较。这在所有情况下都有效,包括午夜后的一小时,但新年的第一个小时除外,因为date -d如果没有指定,则默认为当前年份。我认为你会有比在新年伊始运行这个脚本更好的事情要做。

检查记录年龄是否为非负数可排除未来的记录,正如我在 11 月 3 日测试时在 11 月 14 日的记录中发现的那样。我通过在-d第一次date调用中添加一个参数来模拟不同时间的调用,该参数在答案中获取当前时间参考。

答案2

问题在于"14">" 3"因为 1>" "。您需要在日期中使用前导零。例如,您可以将所有命令放入一个 awk 中:

awk '{ date = sprintf("%02d %s",$2,$3) }
     date>from && /Failed|failure/ { print }
' from="$(LC_TIME=C date +'%d %H:%M:%S' -d -1hour)"

我将%_d其改为%d从日期中获取前导零。在 awk 中,sprintf使用%02d将前导零放入字段 2(日期)。

答案3

awk'($0 >= from)'from="$(LC_ALL=C date +'%b %_d %H:%M:%S'-d -1hour)"~/mail.log|grep-i'Failed\|failure'

嗨!感谢大家的帮助!就我而言,这个脚本有效。如果你想更改 1 小时的时间范围,你可以执行此更改值示例 -d -60minutes 或 -d -2days

相关内容