Linux 在AWK中结束导致无休止地生成操作的系统操作

Linux 在AWK中结束导致无休止地生成操作的系统操作,linux,bash,awk,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")

我正在监视一个日志文件,查找将触发电子邮件的关键字。问题是代码正在无休止地生成电子邮件。我只想收到一封电子邮件,即使有几行相同的关键字

我尝试了以下方法:

'{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"
tail-fn0用户| awk'/disconnect_tcp_conn/{

系统(“邮件-s”服务器已关闭”mail@gmail.com如果服务器返回时有另一条日志消息,则可以在看到断开连接消息时设置变量,并在看到重新连接消息时清除该变量

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 }'


tail-fn0用户| awk'
!服务器关闭和/断开tcp连接/{

系统(“邮件-s”服务器已关闭”mail@gmail.com请不要将此作为答案,因为这只是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
        }
    }
'
awk'
/断开\u tcp\u conn/{report(“down”)}
/重新连接\u tcp\u conn/{report(“up”)}
功能报告(当前状态,消息){
如果(上一个状态!=当前状态){
msg=“服务器为”当前状态
系统(“邮件-s\047”msg”\047mail@gmail.com &2"
上一状态=当前状态
}
}
'

如果您只想在发送电子邮件时退出,则其关键字为
退出
。您找到的代码在第一个输入字段中打印唯一的匹配项。wrt
我只希望结束电子邮件操作并继续监视
-您将继续监视什么,因为您只会在发送该文本时执行任何操作是找到的,你只想在第一次找到时报告?你有其他的代码测试吗?给我们一个真实的例子来得到正确的答案。@tripleee我认为退出是唯一的方法。我想你是对的@Ed,没有理由继续操作。好的。当然,不退出也不报告那个条件是很简单的如果你有什么目的,你可以在第一次发生后问一个后续问题。这正是我想要的,但超出了我的预期。谢谢谢谢!