2017-06-23 10 views
0

docker node ls -f name=managerの出力を解析したいとします。それは私がのgrepでマッチが言葉が見つかりませんされ、「準備完了」場合STATUSはすなわち読むされていない場合は、エラーメッセージを印刷したいbashスクリプトでコマンド出力を解析する

ID       HOSTNAME   STATUS    AVAILABILITY 
kdrdpvwlbwai6626u640sotnh * manager    Ready    Active 

をどのように見えるか

は、bashプロンプトでは、これがあります。

私は試しましたが、空白と引数のためにdocker node ls -f name=managerというコマンドが何らかの理由でスクリプト内の複数のコマンドとして扱われていました。

これを行う正しい方法は何ですか?

答えて

0

これを行うための従来の方法は

#docker command 
if [ $? -ne 0 ] 
then 
    echo "Docker error" 
fi 

だろう編集

デフォルトで

count=$(docker node ls -f name=manager | tail -n 1 | grep -c 'Ready[[:blank:]]*[^[:blank:]]*$') 
if [ $count -ne 1 ] 
then 
    echo "Docker Error" 
fi 
+0

私はこのコマンドのステータスを読み取ろうとしていません。コマンドの出力を解析しようとしています。 – curiousengineer

+0

@curiousengineer:私は知っていますが、 'docker'があなたに与えるだろう'READY以外のものについてはゼロ以外の終了ステータス'。しかし、私はあなたの要件に合った別のソリューションを用意しました。 – sjsam

0

を行うだろう、バッシュは、配列を認識し、以下の、あなたは出力の2行を取得すると仮定すると値は空白文字で区切ります。 セパレータにはIFSという変数があり、変更したい場合はこの変数を変更する必要があります。 定期的なプロセスは以下のとおりです。このVARの古い値を格納し、それを変更し、プロセスデータとそれを復元:

OFS=$IFS 
# for new line there is special var: $'\n' 
IFS=$'\n' 
#your code here 
IFS=$OFS 

SOあなたがそれを、IFSを変える一つの値として、全体のラインを読み、プロセスよりもすることができます置換:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

別のオプションは、(このコマンドは、ホストとステータスを表示します)awkを使用している:

docker node ls -f name=manager | awk '{print $2, $3}' 

OR絞り込むあなたは状況がnであることをホストを検索し、取得しますOT準備:あなたは1つのホストだけを持っている場合は

docker node ls -f name=manager | awk -F' '{if ($3 != "Ready") print $2}' 

それが見つかるかない場合は、印刷することはgrepを使用することができます。

docker node ls -f name=manager | grep -iq "not ready" && echo "Not found" || echo "Found" 

または||echo "Found"を省略しますが、エラーメッセージを印刷したい場合

+0

こんにちはタマール、おかげで、私はちょうど "準備ができて"という言葉が存在するか、 "見つからない"という印があるならば、 "見つかった"印字したいです。各行またはすべての出力に対して – curiousengineer

+0

? – Tamar

+0

@curiousengineerあなたの 'awk'の解決策は、行番号1と行番号2を見れば、フィールドの数になると対応がないので動作しないかもしれません。 2行目の不正な '*'を参照してください。 – sjsam