GNU/Linux >> Znalost Linux >  >> Linux

Jak aplikovat filtr na výstup `tail -f` v reálném čase?

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


Linux
  1. Jak se popasovat s barevným výstupem

  2. Jak mohu grep rekurzivně?

  3. Jak extrahovat dobu trvání z výstupu ffmpeg?

  1. Jak zachytit výstup top příkazu do souboru v linuxu?

  2. Jak zřetězit více řádků výstupu do jednoho řádku?

  3. Jak převést výstup z grep do cp?

  1. Jak předat výstup příkazu jako více argumentů jinému příkazu

  2. Jak mohu odfiltrovat jedinečné výsledky z výstupu grep?

  3. Jak Linux používá hodiny reálného času?