(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