Zeilen zwischen übereinstimmenden Zeichenfolgen filtern

Zeilen zwischen übereinstimmenden Zeichenfolgen filtern

Habe einen Inhalt in der Datei ähnlich wie unten: Es gibt viele Zeilen zwischen START und END und möglicherweise auch Fehler/Warnungen. Ich möchte Fehler-/Warnzeilen zwischen START und END herausfiltern und überspringen, wenn sie nicht vorhanden sind. Die Überschrift variiert mit unterschiedlichen Namen. Aber erstellen Sie eine Logik zum Drucken der nächsten Zeile von START (sollte eine Überschrift sein).

START
Heading1
.......
errors
........
END

START
Heading2
........
........
........
END

START
Heading3
.......
errors
Warning...
END

Erwartete Leistung unten

Heading1
errors

Heading3
errors
Warning...

Ich habe es unten versucht, aber das druckt alles zwischen START und END. Ich muss auch Fehler herausfiltern

awk '/START/,/END/' file

Antwort1

Versuchen:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print hdg; hdg=""}; print} /START/{f=1}' file
Heading1
errors
Heading3
errors

Wie es funktioniert

  • f{hdg=$0; f=0}

    Wenn fwahr (ungleich Null) ist, dann wird die aktuelle Zeile in der Variablen gespeichert hdgund fauf Null zurückgesetzt.

  • /errors|warning/{if(hdg){print hdg; hdg=""}; print}

    Wenn die aktuelle Zeile errorsoder enthält warning, hdgdrucken Sie die Variable aus, sofern sie nicht leer ist. Drucken Sie außerdem die aktuelle Zeile aus.

  • /START/{f=1}

    Wenn die aktuelle Zeile enthält START, setzen Sie die Variable fauf eins.

Mehrzeilige Version

Für diejenigen, die ihre Befehle lieber auf mehrere Zeilen verteilt haben:

awk '
   f {
      hdg=$0
      f=0
   }
   /errors|warning/{
      if(hdg){
         print hdg
         hdg=""
      }
      print
   }
   /START/{
      f=1
   }' file

Variante: Fügen Sie vor der Überschrift eine Leerzeile ein

Wenn die Ausgabe durch eine Leerzeile getrennt werden soll:

$ awk 'f{hdg=$0; f=0} /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1}' file
Heading1
errors

Heading3
errors

Variante: Fehler/Warnungen nach einer END-Zeile ignorieren

$ awk 'f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file
Heading1
errors

Heading3
errors

So machen Sie das Obige unabhängig von Groß- und Kleinschreibung (GNU awk):

awk 'BEGIN{IGNORECASE=1} f{hdg=$0; f=0} g && /errors|warning/{if(hdg){print nl hdg; hdg=""; nl="\n"}; print} /START/{f=1; g=1} /END/{g=0}' file

verwandte Informationen