Angenommen, Sie möchten mit GNU die gesamte Zeile mit Ihrem Muster abgleichen sed
:
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
Standardäquivalent:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
Mit folgender Eingabe ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Die Ausgabe ist:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Erläuterung:
/^dog 123 4335$/
Sucht nach dem gewünschten Muster.
:a; n; p; ba;
ist eine Schleife, die eine neue Zeile von input ( n
) abruft, sie druckt ( p
) und zu label a zurückverzweigt :a; ...; ba;
.
Aktualisieren
Hier ist eine Antwort, die Ihren Anforderungen näher kommt, dh Muster in Datei2, das von Datei1 abweicht:
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
Das eingebettete grep und cut findet die erste Zeile, die ein Muster aus file2 enthält, diese Zeilennummer plus eins wird an tail weitergereicht, die plus eins ist dazu da, die Zeile mit dem Muster zu überspringen.
Wenn Sie mit dem letzten Spiel anstelle des ersten Spiels beginnen möchten, wäre dies:
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
Beachten Sie, dass nicht alle Versionen von tail die Plus-Notation unterstützen.