2013-09-30 15 views
8

Vorrei grep un modello da più file di registro che vengono costantemente aggiornati da alcuni processi e coda l'output di questo grep in modo continuo. Sotto il comando non funziona e ottengo - coda: avvertimento: a seguito di alimentazione standard a tempo indeterminato è inefficacetail di file multipli e grep l'output

tail -f | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log 

Qualcuno può aiutare a risolvere la questione?

+0

duplicati di http://superuser.com/questions/59471/simple-use-of-tail-grep-condizioni multiple –

risposta

10

Si dovrebbe avere uno sguardo a multitail strumento (Installare utilizzando sudo apt-get install multitail)

in breve, con multtail, è necessario utilizzare il flag --mergeall per la visualizzazione di uscita di tutti in un unico luogo

multitail --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

Si può fare lo stesso senza l'utilizzo di grep

multitail -E "Search this: " --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log 

Per visualizzare l'output singolarmente utilizzando multtail, questo darà il nome del file pure.

multitail -E "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log 
+2

Quale versione di multitail stai usando? Non riesco a convertire l'output di Multitail con la versione di Debian: _multitail 5.2.13_ – Thor

+0

@Thor Corretto la mia risposta. –

5

l'errore è che si danno i file al comando grep e non alla coda.

tail -f ha bisogno di ottenere i file come input. Prova:

tail -f /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

per ottenere anche i nomi dei file (ma non sarà come uscita grep è):

tail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered -e'^==> .* <==$' -e'Search this: ' 
+1

grazie.Funziona parzialmente ma non ho i nomi dei file in cui è stato trovato il pattern? – 212

1

Questa è una domanda interessante e la risposta dovrebbe essere semplice: Utilizzare l'interruttore del prefisso con la coda, ma purtroppo questo non è attualmente implementato nella maggior parte delle versioni di tail.

come la vedo io, si hanno due opzioni: adattare gli strumenti standard per l'operazione (vedi Udys answer) o lascia la tua strumento con il linguaggio di scripting/programmazione preferito.

Di seguito è riportato un modo per eseguirlo con il modulo File::Tail::Multi per perl. Si noti che potrebbe essere necessario installare il modulo da CPAN (cpan -i File::Tail::Multi).

Salvare il seguente script, ad es. mtail per il tuo percorso eseguibile e rendere eseguibile lo script.

#!/usr/bin/env perl 

use File::Tail::Multi; 

$| = 1; # Enable autoflush 

$tail = File::Tail::Multi->new(RemoveDuplicate => 0, 
           OutputPrefix => 'f', 
           Files   => \@ARGV); 

while(1) { $tail->read; $tail->print; sleep 2 } 

Change OutputPrefix a 'p', se si preferisce prefissi percorso completo.

Run in questo modo:

mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

Non è necessario specificare --line-buffered quando grep è l'ultimo comando, quindi questo è sufficiente:

mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep "Search this: " 
+0

1) In che modo si differenzia dall'uso del multitail? 2) Produrrà per nome file, come OP chiede in commenti a @Udys risposta> –

+0

@ ansh0l: 1) il multitasking emette i suoi risultati in curses, che non è greppable. 2) Sì, ogni riga ha come prefisso il nome del file di origine. – Thor

+0

Ah ok, +1 per le maledizioni. Ma con la bandiera del multitasile -E, non avrai bisogno di fare lo stesso grep. –