Ini terasa agak konyol, tapi:
$ 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
membalikkan file (banyak sistem non-GNU memiliki tail -r
sebagai gantinya), sed
mengambil baris sampai baris pertama yang dimulai dengan virt-top
. Anda dapat menambahkan sed 1,2d
atau tail -n +3
untuk menghapus tajuk.
Atau di 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
Itu hanya mengumpulkan semua baris ke variabel, dan menghapus variabel itu pada baris yang dimulai dengan virt-top
.
Jika file sangat besar, tac
+sed
solusinya pasti lebih cepat karena hanya perlu membaca bagian akhir file sedangkan awk
solusi membaca file lengkap dari atas.
Dengan ed
Anda dapat melakukan pencarian regex ke atas menggunakan ?pattern?
sebagai pengganti /pattern/
biasa (yang mencari dari atas posisi saat ini). Jadi misalnya:
$ 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
Jika input Anda memiliki jumlah blok yang tetap, Anda juga dapat melakukan sesuatu seperti:
awk '/^virt-top/ && ++n == 2, 0' <your-file
Untuk menampilkan baris dari 2 kemunculan virt-top
ke akhir file (0 artinya false , berarti akhir dari pertama itu ,terakhir rentang tidak pernah ditemukan).