이 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 ")}'