É possível filtrar a saída da cauda?

11

Eu gostaria de seguir um arquivo, mas apenas as linhas de saída que contêm uma determinada string. Isso é possível?

Abe Miessler
fonte

Respostas:

32

use grep. É construído apenas para esse fim.

Para encontrar linhas a partir de um final de / var / log / syslog com "cron", basta executar:

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

E como ele aceita qualquer coisa sobre stdin, você também pode usá-lo na saída de qualquer outro comando, canalizando da mesma maneira que acima (usando o símbolo |).

Ryan H
fonte
8
Embora isso esteja essencialmente correto, é importante perceber que grepo buffer será armazenado quando usado de maneira não interativa, como quando faz parte de um pipeline mais longo. O GNU grep 2.5.1 oferece a --line-bufferedopção de contornar isso ao eliminar o grep do pipeline não é uma opção. (Quando eu digo grep vai tamponar Quer dizer que você não vai ver uma saída até que o buffer atingiu algo como 4k.)
kojiro
Para complementar o comentário anterior, "tail -f" no Linux moderno funcionará em loop, aguardando mais entradas no arquivo syslog. Para que o comando realmente termine com o conteúdo existente no arquivo, omita a opção -f: tail / var / log / syslog | grep cron
Gnudiff 4/11
7
tail -f /var/log/messages | grep "myfilterword"

Espero que ajude.

Pablo
fonte
4

Aqui estão algumas outras idéias que, embora não sejam tão simples, podem oferecer alguma flexibilidade adicional interessante:

Primeiro, você pode filtrar com awk em vez de grep:

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

que funciona exatamente da mesma forma que o exemplo usando grep. Você pode expandir isso usando o poder do awk, por exemplo:

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

que imprimirá o sexto até o último campo da saída (os campos são separados por espaço em branco)

Outra idéia semelhante é usar um liner perl:

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

isso funciona exatamente como grep. Talvez você queira um contador de números de linha e apenas o sexto campo? Que tal agora:

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

Obviamente, todo esse tipo de coisa também pode ser feito com outras ferramentas, mas eu queria ilustrar que existem algumas maneiras divertidas de usar linguagens de propósito geral, como awk ou perl aqui.

Phil Hollenback
fonte
+1 excelente elaboração de como expandir além do grep!
22411
2

Outro truque digno de nota, se você tiver um arquivo CSV com cabeçalhos que deseja omitir, por exemplo:

% 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

Não importa quanto tempo a entrada tailseja, +n -2ela omitirá a primeira linha.

JeffG
fonte