これは少しばかげているように感じますが、
$ 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 を意味します) 、その最初の終わりを意味します 、最後 範囲が見つかりません)。