我有这个 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 ")}'