Comment appliquer un filtre à la sortie en temps réel de `tail -f`?

60
tail -f path

Ce qui précède produira instantanément les modifications apportées au fichier, mais je souhaite appliquer un filtre à la sortie et n'afficher que les mots clés xxx.

Comment aborder cela?

wamp
la source
1
Marquer les réponses comme étant acceptées aide les autres lecteurs de vos questions et leurs réponses à savoir quelle réponse pourrait être plus susceptible de les aider s'ils ont une question ou un problème similaire. Vous pouvez revoir vos questions précédentes en cliquant sur votre nom d'utilisateur.
Dennis Williamson

Réponses:

84

Avec Unix, vous pouvez diriger la sortie d’un programme vers un autre.

Donc, pour filtrer la queue, vous pouvez utiliser grep:

tail -f path | grep your-search-filter
AddersUK
la source
Mais disons que vous avez 100 lignes dans la queue (fin du fichier) et que ces lignes sont celles que vous souhaitez filtrer. Votre solution
TraderJoeChicago
1
Si vous souhaitez uniquement rechercher les 100 dernières lignes d'un fichier, essayez tail -100 path | grep xxx
AddersUK
15

Réponse courte: tail -f somefile | grep somepattern

Cependant, cela a tendance à ne pas aboutir. Supposons que vous mettiez au point un fichier dont la rotation est souvent effectuée (si c'est un journal de débogage, il peut l'être plusieurs fois). Dans ce cas, tail -Fc'est ton ami. Je vous laisse regarder la différence.

Mais tail -fet tail -Fimprimer un tas de premières lignes, ce qui est souvent indésirable dans ce cas d' utilisation, donc dans ce module de cas-n0

tail -F -n0 somefile | grep somepattern

Cela ira jusqu'à ce que vous souhaitiez effectuer un autre filtrage, puis vous devez vous méfier de la mise en mémoire tampon. stdout est mis en tampon de ligne par défaut lors de l'écriture sur un terminal, mais lorsqu'il est entièrement mis en mémoire tampon lors de l'écriture dans un canal. Ainsi, les éléments suivants émettront des lignes dès qu’elles seront trouvées, car elles sont tailexplicitement mises en tampon de ligne (ou vident sa sortie à la fin de chaque ligne) grep.

tail -F -n0 somefile | grep somepattern

Mais ensuite, vous décidez d'utiliser quelque chose comme awkou cutde traiter ultérieurement la sortie.

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

Et maintenant, vous vous demandez où est passée votre sortie ... en fonction du volume de journaux, vous constaterez peut-être que vous obtenez une sortie, mais ce ne sera qu'une page à la fois, car la sortie standard de grepfonctionne désormais de manière totalement tamponnée, et donc awkreçoit l'entrée 4 ko à la fois (par défaut).

Dans ce cas, vous pouvez greptoujours faire en sorte que la ligne stdout soit mise en mémoire tampon en utilisant l' --line-bufferedoption.

tail -F -n0 somefile | grep --line-buffered somepattern | ...

Cependant, la plupart des commandes n'ont pas d'analogue de --line-buffered. Dans le cas d’outils plus scriptables, vous pouvez utiliser une fonction pour vider la sortie (par exemple awk, dans , la fonction est fflush(), qui partage le même nom que son équivalent C, des outils tels que Perl et Python ont quelque chose de similaire).

Avec les goûts de cutvous êtes probablement sans chance; ... mais vous pouvez essayer de chercher unbuffer, ce qui est, je pense, quelque chose fourni par la expectchaîne d'outils (je ne l'ai jamais utilisée).

J'espère que vous avez trouvé cela utile.

À la vôtre, Cameron

Cameron Kerr
la source
J'apprécie vraiment l'explication de la raison pour laquelle cela fonctionne en mode tampon de ligne. C'est un excellent aperçu, merci.
Vert
2

et vous pouvez utiliser plusieurs canaux et greps, et exclure des éléments avec grep -v, obtenir l'insensibilité à la casse avec grep -i, etc.

c'est-à-dire: tail -100f / var / log / messages | grep -V ACPI | grep-i ata

commencez à suivre les 100 lignes à partir de la fin, continuez, excluez tout d'abord les lignes avec ACPI, puis affichez les lignes avec ata, ATA ou toute combinaison de celles-ci.

Une autre option pratique est les options ABC, pour les lignes Après, Avant et Contexte (lignes avant et après).

Ronald Pottol
la source