Dans tail -f, comment filtrer les éléments contenant certains mots clés?

Réponses:

58

Je ne sais pas utiliser awk au lieu de grep, mais cela fonctionne pour moi:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

EDIT: Comme l' ont fait remarquer Dmourati et Caleb , vous pouvez également utiliser egrepplutôt que grep -Epar commodité. Sur certains systèmes, il s’agira d’un lien vers le même fichier binaire, d’autres d’une copie fournie par le paquetage grep. Dans les deux cas, il constitue une alternative au -Ecommutateur. Cependant, selon la page de manuel GNU grep:

[…] Deux variantes de programmes egrepet fgrepsont disponibles. egrepest le même que grep -E. fgrepest le même que grep -F. L'appel direct sous la forme egrepou fgrepest obsolète, mais il est fourni pour permettre aux applications historiques qui en dépendent de s'exécuter sans modification.

S'agissant de commandes, il est préférable que vous n'ayez pas egrep du tout. Cependant, pour la compatibilité en aval, il est recommandé d'utiliser la grep -Esyntaxe car l'autre méthode est officiellement déconseillée.

DTest
la source
Est-ce qu’utiliser grep -Eau lieu de egrepgarantir une réponse en double?
Caleb
@Caleb Je ne vois pas pourquoi pas. Il existe plus d'une façon de traiter un chat avec la peau, et ce site permet de le lister
DTest
1
Oui, mais ce ne sont que des liens symboliques entre eux, pas deux programmes différents avec un chevauchement fonctionnel. Ce ne serait donc pas plus un "addendum" (lire: commentaire), pas une réponse à part entière? J'ai eu des votes négatifs pour des infractions moins graves ...
Marcin
@DTest: De droit, dmourati m'a battu au poing de quelques secondes et bien qu'il n'ait pas expliqué le raisonnement, il mérite un peu de crédit ici. Vous étiez nettement en retard pour le parti puisque nous avions tous les deux eu au moins deux votes positifs avant votre arrivée. Changer la syntaxe d'un binaire avec lien symbolique en argument est généralement une chose pour laquelle vous utiliseriez un commentaire, pas une réponse séparée. Si vous voulez la peau du chat utiliser différemment sed, awk, perl, multitailou ninja_foo.
Caleb
1
@DTest: J'ai pris la liberté de modifier votre réponse de manière factuelle afin d'ajouter des sources originales. Il semble que l'option -E soit recommandée pour une utilisation future. Je l'ai donc marquée, mais j'ai supprimé votre note concernant les distributions sans égrep. Les distributions mentionnées précédemment ont egrep, c'est juste un fichier binaire séparé au lieu d'un lien symbolique.
Caleb
21

Essayez de le rediffuser avec une liste de mots séparés par des filtres que vous souhaitez filtrer:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Notez que l'utilisation de parenthèses autour de la liste des correspondances est facultative. Puisque le |est traité en tant qu'opérateur OU logique par grep, qu'il fasse partie ou non d'un sous-groupe. '(ELB|Pingdom|Health)'fonctionnerait exactement de la même façon. Pour certains, la syntaxe peut être plus évidente; Je trouve qu'il est plus facile de taper sans, car je peux passer d'une seule correspondance à une liste de correspondances possibles sans revenir en arrière pour ajouter la parenthèse.

Pour un crédit supplémentaire, il convient de mentionner que multitailninja foo concerne le filtrage de la sortie. Par exemple, vous pouvez filtrer vos mots comme ceci:

multitail -e ELB -e Pingdom -e Health -f log_file

Vous pouvez également l'utiliser pour colorer ou mettre en surbrillance la sortie au lieu de la filtrer.

EDit: voir la réponse et les commentaires de DTests pour une explication complète de la façon dont egrep est simplement un autre moyen obsolète de se déclencher grep -E.

Caleb
la source
2
l'expression ne devrait-elle pas se terminer par ('), pas par (")?
bbaja42
Oui merci c'était une faute de frappe. Pour les références futures car les sites d’échange de piles fonctionnent comme des wikis, c’est le genre de chose que vous pouvez réparer.
Caleb
Je pensais que le montage devait être plus de 6 caractères?
Sirex
Si vous n'avez pas une haute réputation, oui, il y a un minimum de 6 caractères, mais dans ce cas, le caractère 1 est extrêmement important. Vous pouvez forcer la modification en ajoutant un commentaire HTML au corps. Les caractères compteront dans la limite et vous pourrez noter pourquoi vous effectuez le changement.
Caleb
@Caleb merci beaucoup pour la suggestion multitail c'est génial !! Je ne peux pas croire que je sois resté si longtemps dans ma vie sans cela.
sidewinderguy
5
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
dmourati
la source
3

Pourquoi voulez-vous enregistrer ces informations?

  • Est-ce strictement pour l'archivage?
  • Voulez-vous exécuter conditionnellement différents scripts en fonction de différents mots-clés ou modèles dans les fichiers journaux?

Si vous souhaitez adopter un comportement par script en fonction du contenu des fichiers journaux, vous pouvez effectuer votre filtrage à l'aide de Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect est une extension Tcl, mais il existe également une version Python de Expect.

Expect vous donne cette instruction souple et puissante, qui vous permet de spécifier différents comportements de manière conditionnelle en fonction des états ou des modèles présents dans votre flux d'entrée. Par exemple:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Ainsi, vous spécifiez des modèles dans l'instruction expect, différents comportements, vous pouvez envelopper le tout dans une boucle et vous pouvez facilement écrire des filtres très puissants qui écrivent également des parties de votre entrée dans différents fichiers, ou le supprimer complètement, ou entreprendre des actions et exécuter d'autres scripts en fonction de ce que vous avez entré.

Il s’agit donc de savoir pourquoi vous essayez de filtrer vos fichiers de journaux, d’agir lors de la saisie des journaux ou simplement pour des raisons d’archivage.

Jerry Asher
la source
Plus un pour la référence à Expect, que j’avais utilisé il ya très longtemps et que j'avais complètement oublié.
MPi