Je veux tail -f
mes journaux. Cependant, je veux filtrer tout ce qui contient les mots:
"ELB", "Pingdom", "Santé"
Je veux tail -f
mes journaux. Cependant, je veux filtrer tout ce qui contient les mots:
"ELB", "Pingdom", "Santé"
Réponses:
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 egrep
plutôt que grep -E
par 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 -E
commutateur. Cependant, selon la page de manuel GNU grep:
[…] Deux variantes de programmes
egrep
etfgrep
sont disponibles.egrep
est le même quegrep -E
.fgrep
est le même quegrep -F
. L'appel direct sous la formeegrep
oufgrep
est 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 -E
syntaxe car l'autre méthode est officiellement déconseillée.
grep -E
au lieu de egrep
garantir une réponse en double?
sed
, awk
, perl
, multitail
ou ninja_foo
.
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 multitail
ninja 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
.
Pourquoi voulez-vous enregistrer ces informations?
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.