서비스 상태 명령 출력에 "로드됨" 및 "실행 중"이 나타날 때만 true인 if 문을 사용해야 합니다.
$groupservice status
service 1 is loaded
service 2 is running
앞서 언급했듯이 나는 이것을 사용해 보았습니다.
$service status | awk '/is loaded/ && /is running/'
하지만 아무런 결과도 얻지 못합니다. 이를 실행하는 유일한 방법은 다음과 같습니다.
if [[ $(service status | grep "is loaded") ]] && [[ $(service status | grep "is running") ]]
하지만 나는 더 짧은 표현을 사용하는 것을 선호합니다. 내가 어디서 잘못됐나요? 감사해요
답변1
awk
일치하는 항목 수를 세어 이를 수행할 수 있습니다.
$ service status |
awk '/is loaded/{l++}
/is running/{r++}
(l && r){
print "found";
exit 0
}
END{
if (!(l && r)){
print "not found";
exit 1
}
}'
내가 생각할 수 있는 유일한 방법은 파일에서 두 번 수행하는 것 grep
입니다 . grep
이 같은:
service status |
grep -qF 'is loaded' && foo.sh |
grep -qF 'is running' &&
echo Found ||
echo "not found"
물론 여기에는 경쟁 조건이 있으며 service
호출 간에 출력이 변경되면 잘못된 결과를 얻을 수 있습니다. 이 문제를 해결하려면 tmp 파일을 사용할 수 있습니다.
service status > /tmp/file
grep -qF 'is loaded' /tmp/file &&
grep -qF 'is running' /tmp/file &&
echo Found ||
echo "not found"
답변2
게시한 입력 예와 같이 출력에 빈 줄이 없다고 가정하고 service status
awk를 사용합니다.
if service status | awk -v RS= '/is loaded/ && /is running/{f=1} END{exit !f}'; then
echo "Eureka!"
fi
Eureka!
분명히, 당신이 해야 할 일이 무언가를 인쇄하는 것뿐이라면 쉘 if
문이 필요하지 않거나 awk에서 종료 상태를 제공할 필요가 없습니다.
service status | awk -v RS= '/is loaded/ && /is running/{print "Eureka!"}'
Eureka!
빈 줄이 있고 GNU awk가 RS=
있으면 RS='^$'
.