GNU/Linux >> Tutoriels Linux >  >> Linux

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

Solution 1 :

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

Solution 2 :

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

Cependant, cela a tendance à être insuffisant. Supposons que vous suiviez un fichier qui fait souvent l'objet d'une rotation (s'il s'agit d'un journal de débogage, il peut être tourné plusieurs fois). Dans ce cas tail -F est votre ami. Je vous laisse chercher la différence.

Mais tail -f et tail -F imprimez 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 bien, jusqu'à ce que vous souhaitiez effectuer un autre filtrage, et vous devrez alors vous méfier de la mise en mémoire tampon. stdout est mis en mémoire tampon par défaut lors de l'écriture sur un terminal mais lorsqu'il est entièrement tamponné lors de l'écriture dans un tube. Ainsi, les lignes suivantes émettront des lignes dès qu'elles seront trouvées, car tail est explicitement mis en mémoire tampon en ligne (ou il vide sa sortie à la fin de chaque ligne), et grep est également mis en mémoire tampon en ligne car sa sortie va vers votre terminal :

tail -F -n0 somefile | grep somepattern

Mais alors 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... en fonction du volume de journaux, vous constaterez peut-être que vous obtenez une sortie, mais ce sera une page à la fois car maintenant le stdout de grep fonctionne de manière entièrement tamponnée, et donc awk reçoit une entrée de 4 Ko à la fois (par défaut).

Dans ce cas, vous pouvez indiquer grep pour toujours mettre en mémoire tampon la ligne stdout en utilisant le --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 vider la sortie (par exemple, dans awk , la fonction est fflush() , qui partage le même nom que son homologue C, des outils comme Perl et Python ont quelque chose de similaire).

Avec les goûts de cut vous n'avez probablement pas de chance; ... mais vous pouvez essayer de rechercher unbuffer , qui est je pense quelque chose fourni par le expect chaîne d'outils (je ne l'ai jamais utilisé).

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

Bravo, Cameron

Solution 3 :

et vous pouvez utiliser plusieurs canaux et greps, et exclure des éléments 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 affichez les lignes avec ata, ATA ou n'importe quel mélange de ceux-ci.

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


Linux
  1. Comment grep avec la sortie couleur

  2. Comment puis-je grep récursivement?

  3. Comment extraire la durée de la sortie ffmpeg?

  4. Comment capturer la sortie d'une commande top dans un fichier sous Linux ?

  5. Comment concaténer plusieurs lignes de sortie sur une seule ligne ?

Sortie vers Stdout et en même temps Grep dans un fichier ?

Comment démarrer Grep multi-thread dans le terminal ?

Grep et queue -f ?

3 façons de regarder les journaux en temps réel sous Linux

Comment diriger la sortie de grep vers cp?

Comment passer la sortie de la commande sous forme d'arguments multiples à une autre commande