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).