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