
Ich habe eine Datei, die ungefähr so aussieht:
dn: danan
cn: danian
cn: danian1
dn: danian2
cn: danian2
dn: danian3
cn: danian3
cn: danian4
Ich möchte lediglich das Muster „dn:“ greppen und nur die nächsten beiden Zeilen drucken, aber wenn ich „grep -A 2 „dn:“ ausführe, ist das Ergebnis alles in der Datei. Ich möchte nur die nächsten beiden Zeilen drucken, nicht die nächste Zeile.
Antwort1
Das könnte funktionieren:
$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt
Wir definieren es dn:
als Datensatztrennzeichen. Die Felder in einem Datensatz werden durch ein Zeilenumbruchzeichen voneinander abgegrenzt \n
.
Wenn Sie zwei Zeilen nach einer Zeile haben, die mit beginnt dn:
, bevor ein neuer Datensatz mit beginnt dn:
, haben Sie dreimal ein "\n", was zu 4 Feldern im Datensatz führt. Deshalb prüfen wir, ob der Datensatz mehr als 3 Felder enthält ( NF>3
). Wenn das der Fall ist, drucken wir den gesamten Datensatz aus, müssen aber das voranstellen dn:
.
Beachten Sie, dass NF>3
alle Datensätze mit mehr als zwei aufeinanderfolgenden Zeilen in einem Datensatz gefunden werden. Wenn Sie nur die Datensätze mit genau zwei Zeilen suchen, ändern Sie es in NF==3
.
Wenn die Blöcke durch eine Leerzeile getrennt sind (wie es in einem Ihrer späteren Kommentare der Fall ist), verwenden Sie stattdessen Folgendes:
$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt
Antwort2
Ich führe den obigen Befehl aus und es funktioniert perfekt.
awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}'
die abgegrenzten Blöcke sind leer, es funktioniert perfekt.