GNU/Linux >> Linux Esercitazione >  >> Linux

estrarre le linee dal basso fino alla corrispondenza regex

Sembra un po' sciocco, ma:

$ 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 inverte il file (molti sistemi non GNU hanno tail -r invece), il sed seleziona le righe fino alla prima che inizia con virt-top . Puoi aggiungere sed 1,2d o tail -n +3 per rimuovere le intestazioni.

O in 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

Raccoglie tutte le righe in una variabile e cancella quella variabile su una riga che inizia con virt-top .

Se il file è molto grande, il file tac +sed soluzione è destinata ad essere più veloce poiché deve solo leggere la coda del file mentre il awk soluzione legge il file completo dall'alto.


Con ed puoi cercare con espressioni regolari verso l'alto utilizzando ?pattern? al posto del solito /pattern/ (che cerca dall'alto la posizione corrente). Quindi, ad esempio:

$ 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

Se il tuo input ha un numero fisso di blocchi puoi anche fare qualcosa del tipo:

awk '/^virt-top/ && ++n == 2, 0' <your-file

Per emettere le righe dalla seconda occorrenza di virt-top alla fine del file (0 significa falso , indica la fine di quel primo ,ultimo range non viene mai trovato).


Linux
  1. Rimuovere in modo efficiente le prime due righe da un file di testo?

  2. Estrarre il file dall'immagine Docker?

  3. Awk da linee diverse?

  4. Contare le righe in un file?

  5. Disegna a caso un certo numero di righe da un file di dati?

Come estrarre indirizzi e-mail da file di testo in Linux

Come rimuovere le righe da un file usando il comando Sed

Elenca le righe di un solo file in DIFF

Come estrarre il testo da un file di grandi dimensioni, a partire dalla prima occorrenza di una stringa?

estrarre un singolo file da un enorme file tgz

Come visualizzare determinate righe da un file di testo in Linux?