web-dev-qa-db-fra.com

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

Je veux tail -f mes journaux. Cependant, je veux filtrer tout ce qui contient les mots:

"ELB", "Pingdom", "Santé"

39
Alex

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 le soulignent dmourati et Caleb , vous pouvez également utiliser egrep au lieu de grep -E pour plus de commodité. Sur certains systèmes, ce sera un lien vers le même binaire, dans d'autres une copie fournie par le paquet grep. De toute façon, il vit comme une alternative à la -E commutateur. Cependant, selon la page de manuel GNU grep:

[…] Deux programmes de variantes egrep et fgrep sont disponibles. egrep est identique à grep -E. fgrep est identique à grep -F. L'invocation directe en tant que egrep ou fgrep est déconseillée, mais est fournie pour permettre aux applications historiques qui en dépendent de s'exécuter sans modification.

Comme ce sont des commandes synonymes, cela revient à la préférence, sauf si vous n'avez pas du tout egrep. Cependant, pour la compatibilité ascendante, il est recommandé d'utiliser le grep -E syntaxe car l'autre méthode est officiellement obsolète.

58
DTest

Essayez de le diriger vers egrep avec une liste de mots séparés par des tuyaux 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 | Est traité comme un opérateur logique OR par grep, qu'il apparaisse ou non dans un sous-groupe. '(ELB|Pingdom|Health)' fonctionnerait exactement comme Pour certains, la syntaxe peut être plus évidente, je trouve plus facile de taper sans car je peux passer d'une seule correspondance à une liste de correspondances possibles sans revenir pour ajouter la parenthèse.

Pour un crédit supplémentaire, il convient de mentionner que multitail fait un foo ninja quand il s'agit de filtrer 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 simplement la filtrer.

EDit: Voir réponse DTests et les commentaires pour l'explication complète de la façon dont egrep n'est qu'un moyen alternatif déconseillé de déclencher grep -E.

21
Caleb
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
5
dmourati

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 avoir un comportement scripté en fonction du contenu des fichiers journaux, vous pouvez effectuer votre filtrage à l'aide d'Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect est une extension Tcl mais il existe également une version Python d'Expect.

Expect vous offre cette puissante instruction flexible de type commutateur qui vous permet de spécifier différents comportements sous condition 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  
    }  
}

Donc, vous spécifiez des modèles dans l'instruction expect, vous spécifiez différents comportements, et 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 déposez-les complètement, ou prenez des mesures et exécutez d'autres scripts en fonction de ce que vous avez entré.

Donc, cela revient à pourquoi essayez-vous de filtrer vos fichiers journaux, de prendre des mesures sur l'entrée de journal, ou simplement pour des raisons d'archivage?

3
Jerry Asher