GNU/Linux >> Znalost Linux >  >> Linux

extrahujte řádky zdola, dokud se regulární výraz neshoduje

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).


Linux
  1. Extrahovat soubor z obrázku Dockeru?

  2. Awk z různých řádků?

  3. Počítat řádky v souboru?

  1. Náhodně nakreslit určitý počet řádků z datového souboru?

  2. Počítejte řádky, slova a znaky ze souboru v Linuxu

  3. Odstranění konkrétních řádků ze souboru v příkazovém řádku Linuxu

  1. Jak extrahuji jeden kus bajtů ze souboru?

  2. Odstraňte liché nebo sudé řádky z textového souboru

  3. Jak extrahovat text z velkého souboru počínaje prvním výskytem řetězce?