我需要 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