È possibile filtrare l'output della coda?


11

Vorrei mettere in coda un file ma solo linee di output che contengono una certa stringa. È possibile?

Risposte:


32

usa grep. È costruito proprio per quello scopo.

Per trovare le righe da una coda di / var / log / syslog che contengono "cron", basta eseguire:

tail -f /var/log/syslog | grep cron

E poiché accetta qualsiasi cosa rispetto a stdin, è possibile utilizzarlo anche sull'output di qualsiasi altro comando, eseguendo il piping nello stesso modo di cui sopra (utilizzando il simbolo |).


8
Sebbene ciò sia essenzialmente giusto, è importante rendersi conto che grepverrà bufferizzato quando viene utilizzato in modo non interattivo, ad esempio quando fa parte di una pipeline più lunga. GNU grep 2.5.1 offre la --line-bufferedpossibilità di aggirare questo problema quando eliminare grep dalla pipeline non è un'opzione. (Quando dico che grep eseguirà il buffer intendo che non vedrai l'output fino a quando il buffer non avrà raggiunto qualcosa come 4k.)
kojiro

Per integrare il commento precedente, "tail -f" sotto Linux moderno funzionerà in un ciclo, in attesa di ulteriori input nel file syslog. Per far terminare il comando con i contenuti esistenti nel file, omettere l'opzione -f: tail / var / log / syslog | grep cron
Gnudiff

7
tail -f /var/log/messages | grep "myfilterword"

Spero possa aiutare.


4

Ecco un paio di altre idee, che sebbene non così semplici, possono offrire qualche interessante flessibilità aggiuntiva:

Innanzitutto, puoi filtrare con awk anziché grep:

tail -f /var/log/messages | awk '/myfilterword/'

che funziona esattamente come nell'esempio usando grep. Puoi espanderci usando la potenza di awk, ad esempio:

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

che stamperà dal 6 ° all'ultimo campo dell'output (i campi sono separati da spazi)

Un'altra idea simile è quella di utilizzare un perl one-liner:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

funziona esattamente come grep. Forse vuoi un contatore del numero di riga e solo il sesto campo? Cosa ne pensi di questo:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

Ovviamente tutte queste cose possono essere fatte anche con altri strumenti, ma volevo illustrare che ci sono alcuni modi divertenti di usare linguaggi più generici come awk o perl qui.


+1 grande elaborazione su come espandere oltre grep!
pablo

2

Un altro trucco degno di nota, se si dispone di un file CSV con intestazioni che si desidera omettere, ad esempio:

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

Non importa quanto sia lungo l'input tail, la +n -2ometterà la prima riga.

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.