このbashスクリプトがあり、スクリプト内で「状態変更」という単語のログをgrepしようとし、「状態変更」(最も最近の状態変更とも呼ばれます)という単語を含む最新の行を見つけて、次を見つけます。に「バックアップ」という言葉があります。
問題は、ログが最新の状態変更で更新される時間があるように、現在最初に15秒間スリープモードに設定されていることです。しかし、より良いソリューションが欲しいです。
事前に状態を確認し、15秒後にのみ失敗を報告したいと思います。可能であれば、コードの最初の2行だけを変更し、残りのコードも修正する予定です。どんな助けでも大変感謝します!これが私が現在持っているものです:
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
質問の元のバージョンへの回答
コマンドの 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 ")}'