如何主动 grep 记录某个短语的最后 15 秒?

如何主动 grep 记录某个短语的最后 15 秒?

我有这个 bash 脚本,在脚本内部,我试图 grep 日志中的“状态更改”一词,然后在找到包含“状态更改”一词的最新行(又名最近的状态更改)后,我在该行中查找“备份”一词。

问题是我目前首先将其置于睡眠状态 15 秒,以便日志有时间更新最近的状态更改,但我想要一个更好的解决方案。

我希望它主动检查状态并仅在 15 秒后报告故障。如果可能的话,我只想替换前两行代码,因为我计划对其余代码进行其他修改。任何帮助将不胜感激!这是我目前拥有的:

    sleep 15
    ssh server_one@$1 "grep 'status change' /apps/tests/$2 | tail -1 | grep 'Backup'"
    Output=$?
    if [[ ${Output} -ne 1 ]] ; then
            echo "Pass: It is Backup"
            echo "Pass: It is Backup"  >> $REPORT 
    else
            echo "Fail: It is not Backup"
            echo "Fail: It is not Backup" >> $REPORT
    fi

答案1

针对问题原始版本的答案

对于您的一个命令,替换 grep-tail-grep-if 命令,请尝试:

awk '/status change/{last=$0} END{printf "It is %sBackup\n",(last~/Active/?"":"not ")}' "/apps/tests/$2"

怎么运行的:

  • /status change/{last=$0}

    每次status change找到包含的行时,都会将其保存在变量 中last

  • END{printf "It is %sBackup\n",(last~/Active/?"":"not ")}

    这是在我们完成读取文件后执行的。此时,last将包含最后一行包含的内容status change。如果该行也包含Active,则我们打印It is Backup。否则,我们打印It is not Backup.

    该单词的存在或不存在not由看起来有些复杂的三元语句控制:(last~/Active/?"":"not ")。该语句只是检查是否last~/Active/为真(意味着最后一行包含Active)。如果是,三元语句返回空字符串""。如果不存在,则返回字符串"not "

持续监控

连续监控:

ssh "server_one@$1" tail -f "/apps/tests/$2" | awk '/status change/{printf "It is %sBackup\n",($0~/Backup/?"":"not ")}'

相关内容