GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Zeilen von unten extrahieren, bis Regex übereinstimmt

Das fühlt sich etwas albern an, aber:

$ 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 kehrt die Datei um (viele Nicht-GNU-Systeme haben tail -r stattdessen), die sed wählt Zeilen bis zur ersten aus, die mit virt-top beginnt . Sie können sed 1,2d hinzufügen oder tail -n +3 um die Überschriften zu entfernen.

Oder 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

Es sammelt einfach alle Zeilen zu einer Variablen und löscht diese Variable in einer Zeile, die mit virt-top beginnt .

Wenn die Datei sehr groß ist, wird der tac +sed Die Lösung ist zwangsläufig schneller, da sie nur das Ende der Datei lesen muss, während awk Lösung liest die vollständige Datei von oben.


Mit ed Sie können mit Regex nach oben suchen mit ?pattern? anstelle des üblichen /pattern/ (der von oben nach der aktuellen Position sucht). Also zum Beispiel:

$ 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

Wenn Ihre Eingabe eine feste Anzahl von Blöcken hat, könnten Sie auch so etwas tun:

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

Zur Ausgabe der Zeilen ab dem 2. Vorkommen von virt-top bis zum Ende der Datei (0 bedeutet false , bedeutet das erste Ende ,zuletzt Bereich wird nie gefunden).


Linux
  1. Effizient die ersten paar Zeilen aus einer Textdatei entfernen?

  2. Datei aus Docker-Image extrahieren?

  3. Awk aus verschiedenen Linien?

  4. Zeilen in einer Datei zählen?

  5. Zufällig eine bestimmte Anzahl von Linien aus einer Datendatei zeichnen?

So extrahieren Sie E-Mail-Adressen aus einer Textdatei unter Linux

So entfernen Sie Zeilen aus einer Datei mit dem Sed-Befehl

Entfernen Sie ungerade oder gerade Zeilen aus einer Textdatei

Auflisten von Zeilen aus nur einer Datei in DIFF

Extrahieren Sie eine einzelne Datei aus einer riesigen TGZ-Datei

Wie zeigt man bestimmte Zeilen aus einer Textdatei in Linux an?