【问题标题】:bash only email if occurrence since last alert如果自上次警报以来发生,则仅发送电子邮件
【发布时间】:2015-03-02 16:56:04
【问题描述】:

我正在监视一个特定单词的日志文件,并使用 tac 输出它之前和之后的 5 行

#!/bin/bash
tac /var/log/syslog |grep -m1 -A5 -B5 'WORD' | tac >> /tmp/systemp
mailx email commands  
rm /tmp/systemp

我已经设置了一个 cron 每 5 分钟运行一次,但是正如预期的那样,我收到了重复的警报电子邮件,我如何让它在最后一次出现时发送一封电子邮件,而不是在下一次出现之前再次发送?

Feb 27 15:05:39 WORD (email)
Cron runs again after 5 minutes
Feb 27 15:05:39 WORD (don't email)
Cron runs again after 5 minutes 
Feb 27 15:35:39 WORD (email)

【问题讨论】:

    标签: bash scripting grep


    【解决方案1】:

    您应该只搜索最后 5 分钟的数据:

    data5m=$(awk '$0>=from' from="$(date +"%b %e %H:%M:%S" -d -5min)" /var/log/syslog)
    

    然后你可以从这个数据中grep:

    grep -m1 -C5 'WORD' <<< "$data5m"
    

    更新:

    awk '$0>=from' from="$(date +"%b %e %H:%M:%S" -d -5min)" /var/log/syslog | grep -m1 -C5 'WORD'
    

    或多合一awk

    awk '{a[NR]=$0} /pattern/ && $0>=from {f=NR} END {for (i=f-5;i<=f+5;i++) print a[i]}' from="$(date +"%b %e %H:%M:%S" -d -5min)" /var/log/syslog
    

    【讨论】:

    • 很酷的嵌入式date,但您不能将awk 输出到grep 吗?
    • @shellter,是的,你可以。您甚至可以使用awk 完成所有操作,但如果您喜欢 5 前命中和 5 次命中后模式,它会变得更加复杂。您还可以将-A5-B5 更改为-C5,请参阅我的更新。
    • 谢谢 Jotne 一个问题是即使没有出现这个词,它也会给我发电子邮件,即空白电子邮件。
    • @Lurch 这可以通过测试是否没有数据然后跳过电子邮件命令来简单地解决。
    • @Jotne 我将如何做到这一点,就像尝试使用 'if -eq' 但效果有限。
    猜你喜欢
    • 2021-11-11
    • 2016-07-24
    • 2020-11-09
    • 2021-04-25
    • 2017-10-14
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    相关资源
    最近更新 更多