grep / awkは2つの文字列を一致させるために使用されます。

grep / awkは2つの文字列を一致させるために使用されます。

サービス状況コマンド出力に「ロード済み」と「実行中」が表示された場合にのみ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
            }
        }'

私が考えることができる唯一の方法は、ファイルで2回実行すること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='^$'

関連情報