GNU/Linux >> Linux の 問題 >  >> Linux

正規表現が一致するまで下から行を抽出します

これは少しばかげているように感じますが、

$ 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 を意味します) 、その最初の終わりを意味します 、最後 範囲が見つかりません)。


Linux
  1. テキストファイルから最初の数行を効率的に削除しますか?

  2. Grep一致後のファイルの行数をカウントする方法は?

  3. ファイルの行数を数えますか?

  1. Bashを使用してファイルから行を読み取る:対その間?

  2. Linuxのファイルから行、単語、文字を数える

  3. テキスト ファイルから奇数行または偶数行を削除する

  1. Dockerイメージからファイルを抽出しますか?

  2. アクティブなログ ファイルから最初の N 行を削除する

  3. データファイルから特定の数の行をランダムに描画します