2017-04-30 1 views
1

Ich habe eine Methode in der Bash-Skript, das so etwas wie diesesgrep und schneiden Sie mit einem weiteren Leerzeichen

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

Der Wert $1=abc_mongodb1 oder $1=abc_mongodb2 und so weiter tut. Er sagt mir, wenn die Zeichenfolge 1/1 existiert, bedeutet dies, dass mein Dienst läuft. Das Problem tritt auf, wenn die Ausgabe von docker service ls eine andere Anzahl von Leerzeichen hat, da die Namen der Dienste unterschiedlich lang sind. Wie kann ich das Trennzeichen im ausgeschnittenen Teil der Pipe angeben, um ein oder mehrere Leerzeichen zu verwenden? Die folgenden Arten von Ausgängen sind möglich

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` 

Mein Schnittbefehl funktioniert gut in dem oben genannten. Es schlägt fehl, in dem unten stehenden Fall

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

Verwenden Sie 'awk' anstelle von' cut'. – codeforester

Antwort

0

Verwenden awk, die anmutig wiederholt Räume Griffe:

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

Sie grep beseitigen kann, dass der Check awk Zugabe:

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

oder zu machen, es ist ein wenig klarer:

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

danke, habe ich einfach tr wie folgt verwendet tr trage eine schlechte idee? 'docker service ls | grep" msc_mongodb1 "| tr -s '' | Schnitt -f4 -d '' | grep -w" 1/1 "' – curiousengineer

+1

'tr' oder' sed' können zum Beschneiden von Räumen verwendet werden, aber 'awk' ist das beste Werkzeug für die Extraktion und Filterung von Feldern. – codeforester

1

Sie können versuchen, mit sed alle zusätzlichen Räume vom Eingang zu löschen, bevor es als Eingabe für cut Befehl

sed 's/ \+/\ /g' 

diesen Befehl, um einen einzigen Raum eine beliebige Folge von mehr als einem Raum ersetzt Senden

Ihr Befehl sieht also ungefähr so ​​aus:

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