(5 Antworten)
Vor 2 Jahren geschlossen.
Ich habe eine Datei, die das Muster “====“ mehrfach enthält . Diesen Mustern folgen Texte. Ich möchte nach dem letzten Vorkommen von “====” suchen Muster und drucken Sie alle Linien nach dem Muster. Irgendwelche Ideen, wie man es in Bash macht? Kombination aus grep
, awk
, sed
oder tail
, usw.?
Beispieldatei:
====
First run of script
End of first Script
====
2nd run of script
End of 2nd script
====
3rd run of script
End of 3rd script
Die Ausgabe des Befehls sollte wie folgt aussehen.
3rd run of script
End of 3rd script
Akzeptierte Antwort:
Software-Tool-Methode, effizienter für große Dateien, da sie nur das Ende der Datei liest und dann stoppt, wenn sie die letzte Übereinstimmung findet:
tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac
Hinweis:Erhöhen oder verringern Sie 999999
nach Bedarf, nur damit es länger ist als jedes mögliche Streichholz. Dieser Code funktioniert am besten, wenn im Voraus bekannt ist, dass sich die letzte Übereinstimmung am Ende einer großen Datei befindet. Siehe auch Glenn Jackman ’s Antwort mit Varianten für awk
und sed
die die Notwendigkeit von 999999
vermeiden . Für Systeme mit sehr geringen Ressourcen, grep
ist effizienter als awk
oder sed
.
Um Raten zu vermeiden, wurde stat
hinzugefügt Hässlichkeit würde funktionieren:
f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac