Ř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).