Das fühlt sich etwas albern an, aber:
$ tac file.txt |sed -e '/^virt-top/q' |tac
virt-top time 11:25:17 Host foo.example.com x86_64 32/32CPU 1200MHz 65501MB
ID S RDRQ WRRQ RXBY TXBY %CPU %MEM TIME NAME
1 R 0 0 0 0 0.6 12.0 96:02:53 instance-0000036f
2 R 0 0 0 0 0.2 12.0 95:44:08 instance-00000372
GNU tac
kehrt die Datei um (viele Nicht-GNU-Systeme haben tail -r
stattdessen), die sed
wählt Zeilen bis zur ersten aus, die mit virt-top
beginnt . Sie können sed 1,2d
hinzufügen oder tail -n +3
um die Überschriften zu entfernen.
Oder in awk:
$ awk '/^virt-top/ { a = "" } { a = a $0 ORS } END {printf "%s", a}' file.txt
virt-top time 11:25:17 Host foo.example.com x86_64 32/32CPU 1200MHz 65501MB
ID S RDRQ WRRQ RXBY TXBY %CPU %MEM TIME NAME
1 R 0 0 0 0 0.6 12.0 96:02:53 instance-0000036f
2 R 0 0 0 0 0.2 12.0 95:44:08 instance-00000372
Es sammelt einfach alle Zeilen zu einer Variablen und löscht diese Variable in einer Zeile, die mit virt-top
beginnt .
Wenn die Datei sehr groß ist, wird der tac
+sed
Die Lösung ist zwangsläufig schneller, da sie nur das Ende der Datei lesen muss, während awk
Lösung liest die vollständige Datei von oben.
Mit ed
Sie können mit Regex nach oben suchen mit ?pattern?
anstelle des üblichen /pattern/
(der von oben nach der aktuellen Position sucht). Also zum Beispiel:
$ printf '%s\n' '?ID?+1,$p' q | ed -s file.txt
1 R 0 0 0 0 0.6 12.0 96:02:53 instance-0000036f
2 R 0 0 0 0 0.2 12.0 95:44:08 instance-00000372
Wenn Ihre Eingabe eine feste Anzahl von Blöcken hat, könnten Sie auch so etwas tun:
awk '/^virt-top/ && ++n == 2, 0' <your-file
Zur Ausgabe der Zeilen ab dem 2. Vorkommen von virt-top
bis zum Ende der Datei (0 bedeutet false , bedeutet das erste Ende ,zuletzt Bereich wird nie gefunden).