tail -f path
Ce qui précède produira instantanément les modifications apportées au fichier, mais je souhaite appliquer un filtre à la sortie et n'afficher que les mots clés xxx
.
Comment aborder cela?
tail -f path
Ce qui précède produira instantanément les modifications apportées au fichier, mais je souhaite appliquer un filtre à la sortie et n'afficher que les mots clés xxx
.
Comment aborder cela?
Réponses:
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
Réponse courte: tail -f somefile | grep somepattern
Cependant, cela a tendance à ne pas aboutir. Supposons que vous mettiez au point un fichier dont la rotation est souvent effectuée (si c'est un journal de débogage, il peut l'être plusieurs fois). Dans ce cas, tail -F
c'est ton ami. Je vous laisse regarder la différence.
Mais tail -f
et tail -F
imprimer un tas de premières lignes, ce qui est souvent indésirable dans ce cas d' utilisation, donc dans ce module de cas-n0
tail -F -n0 somefile | grep somepattern
Cela ira jusqu'à ce que vous souhaitiez effectuer un autre filtrage, puis vous devez vous méfier de la mise en mémoire tampon. stdout est mis en tampon de ligne par défaut lors de l'écriture sur un terminal, mais lorsqu'il est entièrement mis en mémoire tampon lors de l'écriture dans un canal. Ainsi, les éléments suivants émettront des lignes dès qu’elles seront trouvées, car elles sont tail
explicitement mises en tampon de ligne (ou vident sa sortie à la fin de chaque ligne) grep
.
tail -F -n0 somefile | grep somepattern
Mais ensuite, vous décidez d'utiliser quelque chose comme awk
ou cut
de traiter ultérieurement 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 ne sera qu'une page à la fois, car la sortie standard de grep
fonctionne désormais de manière totalement tamponnée, et donc awk
reçoit l'entrée 4 ko à la fois (par défaut).
Dans ce cas, vous pouvez grep
toujours faire en sorte que la ligne stdout soit mise en mémoire tampon en utilisant l' --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 awk
, dans , la fonction est fflush()
, qui partage le même nom que son équivalent C, des outils tels que Perl et Python ont quelque chose de similaire).
Avec les goûts de cut
vous êtes probablement sans chance; ... mais vous pouvez essayer de chercher unbuffer
, ce qui est, je pense, quelque chose fourni par la expect
chaîne d'outils (je ne l'ai jamais utilisée).
J'espère que vous avez trouvé cela utile.
À la vôtre, Cameron
et vous pouvez utiliser plusieurs canaux et greps, et exclure des éléments avec grep -v, obtenir l'insensibilité à la casse avec grep -i, etc.
c'est-à-dire: tail -100f / var / log / messages | grep -V ACPI | grep-i ata
commencez à suivre les 100 lignes à partir de la fin, continuez, excluez tout d'abord les lignes avec ACPI, puis affichez les lignes avec ata, ATA ou toute combinaison de celles-ci.
Une autre option pratique est les options ABC, pour les lignes Après, Avant et Contexte (lignes avant et après).