在AWK中结束导致操作不断产生的系统操作

时间:2019-05-10 19:24:24

标签: linux bash awk

我正在监视日志文件中是否有会触发电子邮件的关键字。问题是代码不断产生电子邮件。即使同一关键字有多行,我也只希望收到一封电子邮件。

我尝试了以下操作:

'{if(!seen[$1]++)print $1}'

但我不知道如何将其应用于现有代码:

tail -fn0 user | awk '/disconnect_tcp_conn/ { 
    system("mail -s \"Server is down\" mail@gmail.com </dev/null") 
    print "Server is Down"

所需结果是在发送第一封电子邮件后结束所有电子邮件,或者在发送第一封电子邮件后结束电子邮件和监视。我宁愿只结束电子邮件操作并继续监视,但会结束所有事情。

2 个答案:

答案 0 :(得分:1)

如果服务器重新启动时还有另一条日志消息,则可以在看到断开连接消息时设置一个变量,并在看到重新连接消息时将其清除。

tail -fn0 user | awk '
    !server_down && /disconnect_tcp_conn/ { 
        system("mail -s \"Server is down\" mail@gmail.com </dev/null") 
        print "Server is Down"
        server_down = 1 }
    server_down && /reconnect_tcp_conn/ {
        system("mail -s \"Server is up\" mail@gmail.com </dev/null") 
        print "Server is Up"
        server_down = 0 }'


答案 1 :(得分:0)

请不要接受这个答案,因为这只是对Barmar发布的内容的修饰,后者只是为了展示一种无冗余的替代实现方式:

awk '
    /disconnect_tcp_conn/ { report("down") }
    /reconnect_tcp_conn/  { report("up") }

    function report(curr_state,    msg) {
        if ( prev_state != curr_state ) {
            msg = "Server is " curr_state
            system("mail -s \047" msg "\047 mail@gmail.com </dev/null")
            print msg | "cat>&2"
            prev_state = curr_state
        }
    }
'