Řešení 1:
S Unixem můžete výstup jednoho programu převést do jiného.
Takže k filtrování ocasu můžete použít grep:
tail -f path | grep your-search-filter
Řešení 2:
Krátká odpověď:tail -f somefile | grep somepattern
To však většinou selhává. Řekněme, že omezujete soubor, který se často otáčí (pokud se jedná o protokol ladění, může být otočen vícekrát). V tom případě tail -F
je tvůj přítel. Nechám vás podívat se na rozdíl.
Ale tail -f
a tail -F
nejprve vytiskněte spoustu řádků, což je v tomto případě často nežádoucí, takže v tomto případě přidejte -n0
tail -F -n0 somefile | grep somepattern
To bude v pořádku, dokud nebudete chtít provést nějaké jiné filtrování, a pak si musíte dát pozor na ukládání do vyrovnávací paměti. stdout je ve výchozím nastavení při zápisu do terminálu ukládán do vyrovnávací paměti ale při plném vyrovnávací paměti při zápisu do roury. Takže následující bude vydávat řádky, jakmile jsou nalezeny, protože tail
je explicitně ukládán do vyrovnávací paměti (nebo vyprázdní svůj výstup na konci každého řádku) a grep
je také ukládán do vyrovnávací paměti, protože jeho výstup jde do vašeho terminálu:
tail -F -n0 somefile | grep somepattern
Ale pak se rozhodnete použít něco jako awk
nebo cut
k dalšímu zpracování výstupu.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
A teď se divíte, kam se váš výstup poděl... v závislosti na objemu protokolů možná zjistíte, že výstup dostanete, ale bude to stránka po stránce, protože nyní je stdout grep
pracuje v plně vyrovnávací paměti, a tak awk
přijímá vstup 4 kB najednou (ve výchozím nastavení).
V tomto případě můžete říct grep
aby se stdout řádek vždy ukládal do vyrovnávací paměti pomocí --line-buffered
možnost.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Většina příkazů však nemá analog --line-buffered
. V případě více skriptovatelných nástrojů můžete použít funkci k vyprázdnění výstupu (např. v awk
, funkce je fflush()
, který sdílí stejný název jako jeho protějšek C, nástroje jako Perl a Python mají něco podobného).
S jako cut
pravděpodobně máte smůlu; ... ale můžete zkusit vyhledat unbuffer
, což je myslím něco, co poskytuje expect
toolchain (nikdy jsem ho nepoužil).
Doufám, že to pro vás bylo užitečné.
Na zdraví, Camerone
Řešení 3:
a můžete použít více rour a greps a vyloučit věci pomocí grep -v, získat rozlišení malých a velkých písmen pomocí grep -i atd.
tj.:tail -100f /var/log/messages | grep -V ACPI | grep -i ata
začněte tailing 100 linek od konce a pokračujte v tailingu, nejprve vylučte všechny linky s ACPI, poté zobrazte linky s ata, ATA nebo jakoukoli jejich kombinaci.
Další užitečnou možností jsou možnosti ABC pro řádky After, Before a Context (řádky před a za).