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.