2017-12-29 43 views
-2

In den yml Dateien von Docker Compose sind die Volumes in einem Abschnitt deklariert, der mit volumes: Zeile und beginnt gefolgt von Mustern wie - host/dir:guest:dir. Die Sesktion endet mit dem Start des nächsten Abschnitts, dessen Name nicht immer derselbe ist, und es könnte unter anderem ports:, environment: und networks: sein. Es gibt normalerweise mehr als einen Abschnitt volumes:, und die Anzahl der Zeilen in jedem dieser ist nicht bekannt (und ist nicht über die volumes: Abschnitte konstant).Ein Befehl grep (oder sed oder awk) zum Auswählen aller Zeilen nach einem bestimmten Muster nach einer bestimmten Startzeile in einer Datei

I müssen alle Volumen Erklärungen extrahieren (d.h. - host/dir:guest:dir) aus allen volumes: Abschnitte einer yml Datei.

Danke!

Ein Beispiel yml Datei:

version: '2' 
services: 
    service1: 
    image: repo1/image1 
    volumes: 
     - /dir1/dir2:/dir3/dir4 
     - /dir5/dir6:/dir7/dir8 
    ports: 
     - "80:80" 
    service2: 
    image: repo2/image2 
    volumes: 
     - /dir9/dir10:/dir11/dir12 
    environment: 
     - A: B 
+2

Parse eine 'yaml' mit regex ist, nicht eine gute Idee. Python hat ein 'yaml' Modul um mit – Inian

+0

zu arbeiten Danke @Inian. Ich brauche eine 'Bash'-Einstrich-Lösung. – imriss

+0

gut, wenn Sie glauben, Regex kann dieses Problem lösen, dann fügen Sie Ihre eigenen Bemühungen zu Fragen .. und fügen Sie die erwartete Ausgabe für die Klarheit .. – Sundeep

Antwort

1

awk Einzeiler

Angenommen, Sie / in jedem Volumen Erklärung

Eingang haben:

version: '2' 
services: 
    service1: 
    image: repo1/image1 
    volumes: 
     - /dir1/dir2:/dir3/dir4 
     - /dir5/dir6:/dir7/dir8 
    ports: 
     - "80:80" 
    service2: 
    image: repo2/image2 
    volumes: 
     - /dir9/dir10:/dir11/dir12 
    environment: 
     - A: B 
    volumes: 
     - /dir1/dir2:/dir3/dir4 
     - /dir5/dir6:/dir7/dir8 
meow: 

Ausgang:

$awk '$0!~"/"{a=0} /volumes:/{a=1; next}a' file 
     - /dir1/dir2:/dir3/dir4 
     - /dir5/dir6:/dir7/dir8 
     - /dir9/dir10:/dir11/dir12 
     - /dir1/dir2:/dir3/dir4 
     - /dir5/dir6:/dir7/dir8 

$0!~"/"{a=0}: Wenn der Datensatz/Zeile nicht / enthält, die es nicht ein Volumen Erklärung bedeutet; set a=0
/volumes:/{a=1; next}: Wenn die Zeile enthält volumes: eingestellt dann a=1 und next dh Sprung zum nächsten Datensatz
a: die Datensätze zu drucken, wenn a=1

PS: Wenn in Ihrer yml Datei / einen Tag enthält nur nach kommen kann Volumes kann dies fehlschlagen. Wenn das der Fall ist, dann dieses awk verwenden:

$awk '$1!~"-"{a=0} /volumes:/{a=1; next}a' file 

Diese a wird zurückgesetzt, wenn der erste Bereich nicht -

+1

Vielen Dank! Ich muss awk zum Titel der Frage hinzufügen. – imriss

+0

Sie auch! ....... –

1
awk '$1=="-"{if (f) print; next} {f=/^[[:space:]]*volumes:/}' file 
+0

Danke! Der Fall eines leeren 'Volumes:' Abschnitt sollte selten sein, aber es könnte passieren. – imriss

+0

Das Skript würde es gut behandeln, wenn es passiert, es wird robust/zuverlässig die Deklarationen in jedem 'volumes:' Abschnitt drucken, nicht mehr und nicht weniger. –

+0

Ich wollte das Gleiche sagen. Danken. – imriss

Verwandte Themen