Vorrei mettere in coda un file ma solo linee di output che contengono una certa stringa. È possibile?
Vorrei mettere in coda un file ma solo linee di output che contengono una certa stringa. È possibile?
Risposte:
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 |).
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.
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 -2
ometterà la prima riga.
grep
verrà 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-buffered
possibilità 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.)