In tail -f, come posso filtrare elementi che hanno determinate parole chiave?


Risposte:


58

Non so come usare awk invece di grep, ma questo funziona per me:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

EDIT: Come dmourati e Caleb ha sottolineato, si potrebbe anche usare egrepal posto di grep -Eper convenienza. Su alcuni sistemi questo sarà un collegamento allo stesso binario, in altri una copia fornita dal pacchetto grep. Ad ogni modo, vive in alternativa allo -Eswitch. Tuttavia, secondo la pagina man di GNU grep:

[…] Due programmi varianti egrepe fgrepsono disponibili. egrepè lo stesso di grep -E. fgrepè lo stesso di grep -F. L'invocazione diretta come una egrepo fgrepè deprecata, ma viene fornita per consentire l'esecuzione senza modifiche delle applicazioni storiche che fanno affidamento su di esse.

Dal momento che sono anche comandi, si riduce alle preferenze a meno che tu non abbia egrep affatto. Tuttavia, per la compatibilità futura, si consiglia di utilizzare la grep -Esintassi poiché l'altro metodo è ufficialmente deprecato.


Usare grep -Einvece di egrepgiustificare una risposta duplicata?
Caleb,

@Caleb Non vedo perché no. C'è più di un modo per
scuoiare

1
Sì, ma sono semplicemente collegamenti simbolici tra loro, non due programmi diversi con qualche sovrapposizione funzionale. Quindi non sarebbe più un "addendum" (leggi: commento), non una risposta a tutti gli effetti? Ho avuto voti negativi per reati minori ...
Marcin,

@DTest: per diritto dmourati in realtà mi ha battuto sul pugno di un paio di secondi e anche se non ha spiegato il ragionamento, qui merita un po 'di credito. Sei stato decisamente in ritardo alla festa poiché entrambi avevamo almeno due voti prima che tu entrassi. Cambiare la sintassi da un binario simbolico in un argomento è di solito qualcosa per cui useresti un commento, non una risposta separata. Se si vuole la pelle del gatto modo diverso di utilizzare sed, awk, perl, multitailo ninja_foo.
Caleb,

1
@DTest: mi sono preso la libertà di apportare una modifica fattuale significativa alla tua risposta per aggiungere alcune fonti originali. Sembra che -E sia raccomandato per un utilizzo futuro, quindi l'ho contrassegnato, ma ho rimosso la tua nota sulle distro che non hanno egrep. Le distro menzionate hanno egrep, è solo un binario separato invece di un collegamento simbolico.
Caleb,

21

Prova a convogliarlo per egrep con un elenco di parole separato da una pipa che vuoi filtrare:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Si noti che l'uso delle parentesi nell'elenco delle corrispondenze è facoltativo. Dal momento che il| grep viene trattato come un operatore logico OR da grep, indipendentemente dal fatto che si verifichi o meno come parte di un sottogruppo. '(ELB|Pingdom|Health)'funzionerebbe esattamente allo stesso modo. Per alcuni, la sintassi può essere più ovvia; Trovo più facile digitare senza, poiché posso passare da una singola corrispondenza a un elenco di possibili corrispondenze senza tornare indietro per aggiungere la parentesi.

Per ulteriore credito, vale la pena ricordare che multitailfa ninja foo quando si tratta di filtrare l'output. Ad esempio puoi filtrare le tue parole in questo modo:

multitail -e ELB -e Pingdom -e Health -f log_file

Puoi anche usarlo per colorare o altrimenti evidenziare l'output invece di filtrarlo.

MODIFICA: vedere la risposta di DTest e i commenti per la spiegazione completa di come egrep sia solo un modo alternativo deprecato di sparare grep -E.


2
l'espressione non dovrebbe finire con ('), non con (")?
bbaja42

Sì, grazie, è stato un refuso. Per riferimenti futuri poiché i siti di scambio di stack funzionano come i wiki, questo è il tipo di cose che puoi semplicemente risolvere.
Caleb,

Pensavo che la modifica dovesse essere più di 6 caratteri?
Sirex,

Se non hai un alto rappresentante, sì, c'è un minimo di 6 caratteri, ma in questo caso 1 carattere è molto importante. Puoi forzare la modifica aggiungendo un commento HTML al corpo. I personaggi contano ai fini del limite e puoi notare perché stai apportando la modifica.
Caleb,

@Caleb grazie mille per il suggerimento multitail è fantastico !! Non riesco a credere di esserci andato tanto a lungo nella mia vita senza di essa.
sidewinderguy

5
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'

3

Perché vuoi registrare queste informazioni?

  • È rigorosamente per l'archiviazione?
  • Vuoi eseguire in modo condizionale diversi script a seconda delle diverse parole chiave o schemi nei file di registro?

Se si desidera avere un comportamento basato su script in base al contenuto dei file di registro, è possibile che si desideri effettuare il filtro utilizzando Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect è un'estensione Tcl ma esiste anche una versione Python di Expect.

Expect ti offre questo potente interruttore flessibile come un'istruzione che ti consente di specificare condizionalmente diversi comportamenti a seconda degli stati o dei modelli presenti nel tuo flusso di input. Per esempio:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Quindi specifichi i pattern nell'attesa di attesa e specifichi comportamenti diversi, e puoi avvolgere tutto in un ciclo, e puoi facilmente scrivere filtri molto potenti che scrivono anche parti del tuo input in file diversi, o rilasciarlo del tutto, oppure intraprendi delle azioni ed esegui altri script in base a ciò che è inserito.

Quindi, si riduce al motivo per cui stai cercando di filtrare i tuoi file di registro, di agire sull'input del registro o solo per motivi di archiviazione?


Più uno per il riferimento a Expect, che ho usato molto tempo fa e di cui mi ero completamente dimenticato.
MPi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.