Eu gostaria de seguir um arquivo, mas apenas as linhas de saída que contêm uma determinada string. Isso é possível?
Eu gostaria de seguir um arquivo, mas apenas as linhas de saída que contêm uma determinada string. Isso é possível?
Respostas:
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 |).
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.
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 tail
seja, +n -2
ela omitirá a primeira linha.
grep
o 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-buffered
opçã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.)