これは少しばかげているように感じますが、
$ 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 ファイルを反転します (多くの非 GNU システムには tail -r があります 代わりに)、sed virt-top で始まる最初の行までを選択します . sed 1,2d を追加できます または tail -n +3 ヘッダーを削除します。
または 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
すべての行を変数に収集し、virt-top で始まる行でその変数をクリアします。 .
ファイルが非常に大きい場合、tac +sed awk の間、ファイルの末尾を読み取るだけでよいため、ソリューションはより高速になるはずです。 ソリューションはファイル全体を先頭から読み取ります。
ed で 上向きに正規表現検索できます ?pattern? を使用 通常の /pattern/ の代わりに (現在位置の上から検索します)。例えば:
$ 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
入力に固定数のブロックがある場合は、次のようなこともできます:
awk '/^virt-top/ && ++n == 2, 0' <your-file
virt-top が 2 回出現する行を出力するには ファイルの最後まで (0 は false を意味します) 、その最初の終わりを意味します 、最後 範囲が見つかりません)。