GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie bekomme ich die n-te Zeile nach einer gruppierten?

An den beiden vorherigen Antworten ist nichts auszusetzen, aber ich wollte Sie darauf aufmerksam machen, dass das Finden der dritten Zeile nach einem Muster in einem einzigen sed erledigt werden kann Aufruf:

sed -n "/four/ { n; n; p }" SourceData.txt

Da ein einzelnes Programm die Arbeit erledigt, ist dies effizienter als das Ausführen mehrerer Filter. Der obige Befehl gibt die dritte Zeile nach jeder Instanz von "four" aus, außer wenn dies in einer der beiden Zeilen nach einer Übereinstimmung erneut vorkommt (die anderen Lösungen behandeln diesen Fall auch nicht in der erwarteten Weise); außerdem wird keine Ausgabe generiert, wenn sich das Muster in der letzten oder vorletzten Zeile der Datei befindet, was Ihren Wünschen entsprechen kann oder auch nicht.

Um nur die erste Instanz abzugleichen:

sed -n "/four/ { n; n; p; q }" SourceData.txt

(Beachten Sie, dass diese Antwort so effizient wie möglich ist, indem der Scan beendet wird, sobald die Übereinstimmung gefunden wird.)

Ich füge diese Lösung hinzu, weil es sich lohnt, sed kennenzulernen und trotz seiner eher abstoßenden Syntax (reguläre Ausdrücke sind schon schlimm genug!) kann es oft äußerst nützlich sein. Dieses Tutorial ist eine gute Einführung.


Diese Lösung gibt die aktuelle Zeile aus, wenn es vor zwei Zeilen eine Übereinstimmung gab. Es unterscheidet sich geringfügig von einigen anderen Antworten, da es kein weiteres Match verpasst, selbst wenn es kurz nach dem vorherigen Match stattfindet.

awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'

Immer wenn es eine Übereinstimmung gibt, werden die Informationen in t[0] gespeichert . Bei jeder Zeile die t Das Array wird verschoben (einschließlich der Verschiebung von t[-1] bis t[0] um den Wert von t[0] zurückzusetzen ). Die Zeile wird gedruckt, wenn das Array anzeigt, dass es vor zwei Zeilen eine Übereinstimmung gab.

Sie können ganz einfach eine andere Verzögerung einstellen (z. B. delay=7 ) oder verwenden Sie ein anderes Muster (z. B. /sda[[:digit:]]/ )


Sie können diesen Ausdruck (input.txt ):

grep "four" -A 2 input.txt | tail -n 1

Ausgabe ist:

six 6

Die grep Option "-A 2" besagt, dass zwei Zeilen nach der übereinstimmenden Zeile ausgegeben werden.
Und die tail Option "-n 1" besagt, dass nur die letzte 1 Zeilen dieses Ergebnisses werden zurückgegeben.


Linux
  1. Wie erhalte ich eine Anzahl von Dateien in einem Verzeichnis über die Befehlszeile?

  2. Wie bekomme ich sicher die Version von Ksh?

  3. Nur den Teil einer Linie nach einem übereinstimmenden Muster zurückgeben?

  4. Wie erhält man die Md5-Summe des Inhalts eines Verzeichnisses als eine Summe?

  5. Wie zähle ich die Anzahl der Zeilen in einer Datei nach einem Grep-Match?

So erhalten Sie die Größe eines Verzeichnisses in Linux

So holen Sie das Beste aus Qmmp 1.0 heraus

Wie verschiebt man eine Zeile in einer Textdatei um eine Zeile nach oben oder unten?

Wie erhalte ich ein Äquivalent von /dev/one in Linux

Wie erhalte ich die NVIDIA-Treiberversion von der Befehlszeile?

Wie erhalte ich die URL der Dropbox-Datei von der Befehlszeile?