2017-04-30 8 views
1

私はこのグレップおよび1つの以上のスペースで切断は

status=$(docker service ls|grep $1|cut -f7 -d' '| grep -w "1/1") 

$1=abc_mongodb1または$1=abc_mongodb2などのような何かをするのbashスクリプト内のメソッドを持っています。文字列1/1が存在すると、それは私のサービスがアップしていることを意味します。サービスの名前の長さが異なるため、docker service lsの出力に異なる数のスペースがあると問題が発生します。 1つまたは複数のスペースを使用するようにパイプのカット部分のデリミタにどのように伝える必要がありますか。次の種類の出力が可能です。

Output of type1 
`ID   NAME   MODE  REPLICAS IMAGE 
fw2qdrh38oeq abc_mongodb2 replicated 1/1  mongo:3.4 
l9mvn0wvqaxy abc_mongodb1 replicated 1/1  mongo:3.4 
pfjlpa29yb59 abc_mongodb3 replicated 1/1  mongo:3.4` 

上記の場合、My cutコマンドは正常に動作します。これは、以下の場合には優雅に繰り返されるスペースを扱う

Output of type 2(failure case) 
ID   NAME     MODE  REPLICAS IMAGE 
45uhn1au50ue abc_deltaservice  replicated 1/1  abc-deltaservice:latest 
cubbmpw657ib abc_mongodb1   replicated 1/1  mongo:3.4 
gil4c53jrvyc abc_mongodb2   replicated 1/1  mongo:3.4 
hy9ooec4rapd abc_executionengine replicated 1/1  abc-executionengine:latest 
vocsigy76ab0 msc_mongodb3   replicated 1/1  mongo:3.4 
ze4jg0f2y0jt abc_kongdb   replicated 1/1  postgres:9.4 
+1

'cut'の代わりに' awk'を使います。 – codeforester

答えて

0

使用awkを失敗:

status=$(docker service ls | awk -v service=$1 '$2 == service { print $4 }' | grep -w "1/1") 

あなたはawkにそのチェックを追加することにより、grepを排除することができます

status=$(docker service ls | awk -v service=$1 '$2 == service && $4 == "1/1" { print $4 }') 

か、作るためにそれはもう少し明確です:

status=$(docker service ls | awk -v service=$1 -v state="1/1" '$2 == service && $4 == state { print $4 }') 
+1

ありがとう、私はちょうど次のようにtrを使用して、tr悪い考えを使用している? 'dockerサービスls | grep" msc_mongodb1 "| tr -s '' | cut -f4 -d" | grep -w "1/1" ' – curiousengineer

+1

' tr'または 'sed'はトリミングスペースに使用できますが、 awkは、フィールドの抽出とフィルタリングに最適なツールです。 – codeforester

1

あなたは、このコマンドは、単一のスペース

に複数の空間の任意のシーケンスを置き換えますcutコマンド

sed 's/ \+/\ /g' 

への入力として、それを送信する前にsedで入力から任意の追加のスペースを削除しようとすることができますコマンドは次のようになります:

status=$(docker service ls|grep $1|sed 's/ \+/\ /g'|cut -f7 -d' '| grep -w "1/1") 
関連する問題