2017-12-05 1 views
2

Ich schreibe ein Shell-Skript, um mit unserem lokalen Docker Repo zu interagieren und habe festgestellt, dass ich andere Ergebnisse von meinem Bash-Skript als erwartet bekomme. Zuerst wird von der Befehlszeile:Nicht alle Zeilen von grep Ausgabe zurückgegeben

[email protected]: docker images | grep gateway 

ich:

test-gateway  4.27.0-1.5.2-301 b215d109c627  8 days ago   1.977 GB 
test-gateway  dev     b215d109c627  8 days ago   1.977 GB 
test-gateway  staging    b215d109c627  8 days ago   1.977 GB 
test-gateway  4.26.2-1.5.2-298 7376dd26db6e  2 weeks ago   2.117 GB 
test-gateway  4.26.2-1.5.2-297 c84e6de5a18e  2 weeks ago   2.117 GB 
test-gateway  4.26.0-1.5.2-296 e6a772c0e230  2 weeks ago   2.048 GB 
test-gateway  4.24.3-1.5.2-295 d3743f5246f4  3 weeks ago   1.978 GB 
test-gateway  prod    d3743f5246f4  3 weeks ago   1.978 GB 
test-gateway  4.24.1-1.5.2-294 99065a070172  5 weeks ago   1.908 GB 
test-gateway  4.24.1-1.5.2-293 90639b86573a  5 weeks ago   1.908 GB 
test-gateway  4.24.1-1.5.2-292 223f8c3a41cf  5 weeks ago   1.908 GB 
test-gateway  4.24.0-1.5.2-291 5646792848cf  6 weeks ago   1.873 GB 
test-gateway  4.24.0-1.5.2-290 8a4e92f6a7b9  6 weeks ago   1.847 GB 
test-gateway  4.24.0-1.5.2-289 475e72c8691e  6 weeks ago   1.847 GB 
test-gateway  4.23.8-1.5.2-288 1c83a9f9ccc4  7 weeks ago   1.812 GB 
test-gateway  4.23.8-1.5.2-287 5e77c056c703  7 weeks ago   1.812 GB 
test-gateway  4.23.7-1.5.2-286 b9d9f95ec17d  7 weeks ago   1.812 GB 
test-gateway  4.23.6-1.5.2-282 f40fe68c0183  8 weeks ago   1.997 GB 

das folgende Skript ausführen:

#!/bin/bash 
docker images | grep gateway | while read line; do 
    read line 
    echo "$line" 
done; 

Returns:

test-gateway  staging    b215d109c627  8 days ago   1.977 GB 
test-gateway  4.26.2-1.5.2-298 7376dd26db6e  2 weeks ago   2.117 GB 
test-gateway  4.26.0-1.5.2-296 e6a772c0e230  2 weeks ago   2.048 GB 
test-gateway  prod    d3743f5246f4  3 weeks ago   1.978 GB 
test-gateway  4.24.1-1.5.2-293 90639b86573a  5 weeks ago   1.908 GB 
test-gateway  4.24.0-1.5.2-291 5646792848cf  6 weeks ago   1.873 GB 
test-gateway  4.24.0-1.5.2-289 475e72c8691e  6 weeks ago   1.847 GB 
test-gateway  4.23.8-1.5.2-287 5e77c056c703  7 weeks ago   1.812 GB 
test-gateway  4.23.6-1.5.2-282 f40fe68c0183  8 weeks ago   1.997 GB 

Warum nicht der Fall ist das Bash-Skript gibt alle übereinstimmenden Zeilen zurück?

HINWEIS: Wenn ich mir die Ausgabe ansehe, die ich sehe, scheint das Skript irgendwie Zeilen zu entfernen, in denen die Größe der Bilder gleich ist - was es noch seltsamer macht, da nichts die Ausgabe im Skript einschränkt.

+1

nicht auf die Frage bezogen, nur zu beachten, statt Rohr, manchmal besser ist, zu schreiben: 'während lesen ... done <<(Docker Bilder | grep Gateway)' – jm666

Antwort

4

Sie haben einen zusätzlichen Aufruf read line, der Sie jede Zeile der Ergebnisse überspringen lässt, während Sie die Ausgabe parsen, die entfernt werden muss.

Entfernen Sie auch eine zusätzliche Schicht von Sub-Shell-Verarbeitung durch Einführung einer einfachen process-substitution Syntax mit einem read Befehl und While-Schleife. Die Syntax erlaubt grundsätzlich das Lesen von der Befehlsausgabe als ob sie aus einer Datei lesen würde.

while IFS= read -r line; do 
    printf '%s\n' "$line" 
done< <(docker images | grep gateway) 
+2

* Stirn schmatzt intelligent * Dank @Inian - das habe ich sicher vermisst! –

+0

@JayBlanchard: Es passiert;) – Inian

Verwandte Themen