grep/awk는 두 문자열을 일치시키는 데 사용됩니다.

grep/awk는 두 문자열을 일치시키는 데 사용됩니다.

서비스 상태 명령 출력에 "로드됨" 및 "실행 중"이 나타날 때만 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 statusawk를 사용합니다.

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='^$'.

관련 정보