93 votes

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

tail -f path

Ce qui précède produira instantanément les modifications apportées au fichier, mais je veux appliquer un filtre à la sortie, pour ne l'afficher que lorsqu'il y a un mot-clé. xxx en elle.

Comment aborder cette question ?

114voto

Johnathan Mann Points 61

Avec Unix, vous pouvez faire passer la sortie d'un programme dans un autre.

Donc pour filtrer la queue, vous pouvez utiliser grep :

tail -f path | grep your-search-filter

31voto

Cameron Kerr Points 3781

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

Cependant, cela a tendance à ne pas être suffisant. Disons que vous suivez un fichier qui est souvent modifié (s'il s'agit d'un journal de débogage, il peut être modifié plusieurs fois). Dans ce cas tail -F est votre ami. Je te laisse chercher la différence.

Mais tail -f y tail -F imprime d'abord un tas de lignes, ce qui est souvent indésirable dans ce cas d'utilisation, donc dans ce cas ajoutez -n0

tail -F -n0 somefile | grep somepattern

Ce sera parfait jusqu'à ce que vous souhaitiez effectuer d'autres filtrages. Dans ce cas, vous devrez faire attention à la mise en mémoire tampon. lors de l'écriture dans un terminal mais lorsqu'il s'agit d'écrire dans un tube, le tampon est plein. Ainsi, ce qui suit émettra des lignes dès qu'elles seront trouvées, car tail est explicitement tamponné par ligne (ou il vide sa sortie à la fin de chaque ligne), et grep est également mis en tampon de ligne car sa sortie est envoyée à votre terminal :

tail -F -n0 somefile | grep somepattern

Mais ensuite, vous décidez d'utiliser quelque chose comme awk ou cut pour poursuivre le traitement de la sortie.

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

Et maintenant, vous vous demandez où est passée votre sortie... selon le volume des journaux, vous pouvez constater que vous obtenez une sortie, mais ce sera une page à la fois parce que maintenant le stdout de grep fonctionne en mode "full-buffer", et donc awk reçoit l'entrée 4kB à la fois (par défaut).

Dans ce cas, vous pouvez dire grep pour que la ligne stdout soit toujours mise en tampon en utilisant l'option --line-buffered option.

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 purger la sortie (par exemple, dans la fonction awk la fonction est fflush() Les outils comme Perl et Python ont quelque chose de similaire).

Avec des personnes comme cut vous n'avez probablement pas de chance ; ... mais vous pouvez essayer de rechercher unbuffer qui, je pense, est fourni par le expect toolchain (je ne l'ai jamais utilisé).

J'espère que cela vous a été utile.

A la vôtre, Cameron

2voto

automatonic Points 2830

Et vous pouvez utiliser plusieurs pipes et greps, et exclure des choses avec grep -v, obtenir une insensibilité à la casse avec grep -i, etc.

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

commencez à suivre 100 lignes à partir de la fin, et continuez à suivre, excluez d'abord toutes les lignes avec ACPI, puis montrez les lignes avec ata, ATA, ou n'importe quel mélange de ceux-ci.

Une autre option pratique est l'option ABC, pour les lignes After, Before et Context (lignes avant et après).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X