Zní to trochu hloupě, ale:
$ 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
obrátí soubor (mnoho systémů bez GNU má tail -r
místo toho), sed
vybírá řádky až do prvního, který začíná virt-top
. Můžete přidat sed 1,2d
nebo tail -n +3
k odstranění záhlaví.
Nebo v 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
Pouze shromáždí všechny řádky do proměnné a vymaže tuto proměnnou na řádku začínajícím virt-top
.
Pokud je soubor velmi velký, tac
+sed
řešení je nutně rychlejší, protože potřebuje číst pouze konec souboru, zatímco awk
řešení přečte celý soubor shora.
S ed
můžete pomocí regulárního výrazu vyhledávat nahoru pomocí ?pattern?
místo obvyklého /pattern/
(který vyhledává shora aktuální pozici). Takže například:
$ 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
Pokud má váš vstup pevný počet bloků, můžete také udělat něco jako:
awk '/^virt-top/ && ++n == 2, 0' <your-file
Pro výstup řádků z 2 výskytu virt-top
na konec souboru (0 znamená nepravda , znamená konec toho prvního ,poslední rozsah nebyl nikdy nalezen).