![grep/awk는 두 문자열을 일치시키는 데 사용됩니다.](https://linux55.com/image/192641/grep%2Fawk%EB%8A%94%20%EB%91%90%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%9D%BC%EC%B9%98%EC%8B%9C%ED%82%A4%EB%8A%94%20%EB%8D%B0%20%EC%82%AC%EC%9A%A9%EB%90%A9%EB%8B%88%EB%8B%A4..png)
서비스 상태 명령 출력에 "로드됨" 및 "실행 중"이 나타날 때만 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='^$'
.