GNU/Linux >> Znalost Linux >  >> Linux

Jak najít poslední výskyt vzoru a vytisknout všechny řádky po posledním výskytu?

Tato otázka zde již obsahuje odpovědi :Získávání textu z poslední značky do EOF v POSIX.2

(5 odpovědí)
Uzavřeno před 2 lety.

Mám soubor, který obsahuje více výskytů vzoru “====“ . Po těchto vzorech následují texty. Chtěl bych vyhledat poslední výskyt “====“ vzor a tisknout všechny řádky po vzoru. Nějaké nápady, jak to udělat v bash? Kombinace grep , awk , sed nebo tail atd.?

Ukázkový soubor:

====

First run of script

End of first Script

====

2nd run of script

End of 2nd script

====

3rd run of script

End of 3rd script

Výstup příkazu by měl vypadat následovně.

3rd run of script

End of 3rd script

Přijatá odpověď:

Metoda softwarových nástrojů, efektivnější pro velké soubory, protože čte pouze konec souboru a poté se zastaví, když najde poslední shodu:

tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac

Poznámka:zvyšte nebo snižte 999999 podle potřeby, jen aby byla delší než jakákoli možná shoda. Tento kód by fungoval nejlépe, kdyby bylo předem známo, že poslední shoda je blízko konce velkého souboru. Viz také Glenn Jackman Odpověď s variantami pro awk a sed které se vyhnou potřebě 999999 . Pro systémy s velmi nízkými zdroji grep je efektivnější než awk nebo sed .

Aby se předešlo hádání, někteří přidali stat ošklivost by fungovala:

f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac

Linux
  1. Jak najít všechny řídké soubory v Linuxu

  2. Jak mohu přimět grep, aby vytiskl řádky pod a nad každým odpovídajícím řádkem?

  3. Jak použít sed k odstranění posledních n řádků souboru

  1. Jak vytisknout řádky číslo 15 a 25 z každých 50 řádků?

  2. Jak zjistit typ souboru Img a připojit jej?

  3. Jak zrušit propojení všech symbolických odkazů v adresáři?

  1. Jak zjistit počet vertikálních linek dostupných v terminálu?

  2. Vytisknout obsah souboru bez prvního a posledního řádku?

  3. Jak rekurzivně vypsat všechny soubory a adresáře