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
f
wahr (ungleich Null) ist, dann wird die aktuelle Zeile in der Variablen gespeicherthdg
undf
auf Null zurückgesetzt./errors|warning/{if(hdg){print hdg; hdg=""}; print}
Wenn die aktuelle Zeile
errors
oder enthältwarning
,hdg
drucken 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 Variablef
auf 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