GNU/Linux >> Linux Esercitazione >  >> Linux

Come applicare un filtro all'output in tempo reale di `tail -f`?

Soluzione 1:

Con Unix puoi convogliare l'output di un programma in un altro.

Quindi per filtrare tail, puoi usare grep:

tail -f path | grep your-search-filter

Soluzione 2:

Risposta breve:tail -f somefile | grep somepattern

Tuttavia, questo tende a non essere all'altezza. Supponiamo che tu stia seguendo un file che viene ruotato spesso (se si tratta di un registro di debug, potrebbe essere ruotato più volte). In tal caso tail -F È tuo amico. Ti lascerò cercare la differenza.

Ma tail -f e tail -F stampa prima un mucchio di righe, che spesso è indesiderabile in questo caso d'uso, quindi in questo caso aggiungi -n0

tail -F -n0 somefile | grep somepattern

Andrà bene, fino a quando non vorrai fare qualche altro filtro, e quindi dovrai fare attenzione al buffering. stdout è bufferizzato di riga per impostazione predefinita durante la scrittura su un terminale ma quando è completamente bufferizzato quando si scrive su una pipe. Quindi quanto segue emetterà righe non appena vengono trovate, perché tail è esplicitamente bufferizzato in linea (o svuota il suo output alla fine di ogni riga), e grep è anche bufferizzato perché il suo output sta andando al tuo terminale:

tail -F -n0 somefile | grep somepattern

Ma poi decidi di usare qualcosa come awk o cut per elaborare ulteriormente l'output.

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

E ora ti chiedi dove sia andato a finire il tuo output... a seconda del volume dei log, potresti scoprire che ottieni output, ma sarà una pagina alla volta perché ora lo stdout di grep funziona in modo completamente bufferizzato, quindi awk riceve input 4kB alla volta (per impostazione predefinita).

In questo caso, puoi dire a grep per rendere sempre bufferizzata la riga stdout utilizzando --line-buffered opzione.

tail -F -n0 somefile | grep --line-buffered somepattern | ...

Tuttavia, la maggior parte dei comandi non ha un analogo di --line-buffered . Nel caso di strumenti più scriptabili, puoi utilizzare una funzione per svuotare l'output (ad es. in awk , la funzione è fflush() , che condivide lo stesso nome della sua controparte C, strumenti come Perl e Python hanno qualcosa di simile).

Con artisti del calibro di cut probabilmente sei sfortunato; ... ma potresti provare a cercare unbuffer , che penso sia qualcosa fornito dal expect toolchain (non l'ho mai usato).

Spero che tu l'abbia trovato utile.

Saluti, Cameron

Soluzione 3:

e puoi utilizzare più pipe e grep ed escludere cose con grep -v, ottenere l'insensibilità tra maiuscole e minuscole con grep -i, ecc.

es.:tail -100f /var/log/messages | grep -V ACPI | grep -i ata

inizia a seguire 100 righe dalla fine e continua a seguire, prima escludi tutte le righe con ACPI, quindi mostra le righe con ata, ATA o qualsiasi combinazione di queste.

Un'altra opzione utile sono le opzioni ABC, per le righe After, Before e Context (righe prima e dopo).


Linux
  1. Come evidenziare una parola nell'output di "cat"??

  2. Output su Stdout e allo stesso tempo Grep in un file?

  3. Come eseguire il grep con l'output a colori

  4. Come reindirizzare l'output del comando time su un file in Linux?

  5. Come concatenare più righe di output in una riga?

3 modi per guardare i registri in tempo reale in Linux

Come acquisire l'output di un comando top in un file in Linux?

Come grep \n nel file

Come posso filtrare i risultati univoci dall'output di grep?

In che modo Linux utilizza un orologio in tempo reale?

Come ordinare l'output di ps in base all'ora di inizio del processo?