grep pattern die nächsten zwei Zeilen und verwerfen das Muster mit einer Zeile

grep pattern die nächsten zwei Zeilen und verwerfen das Muster mit einer Zeile

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>3alle 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.

verwandte Informationen