grep et queue -f?


28

Est-il possible de faire un tail -f(ou similaire) sur un fichier, et grepce en même temps? Cela ne me dérangerait pas que d'autres commandes recherchent simplement ce genre de comportement.

Réponses:


46

En utilisant GNU tailet GNU grep, je suis capable de faire un grep en tail -futilisant la syntaxe directe:

tail -f /var/log/file.log | grep search_term

Il s'agit d'une solution qui fonctionne avec d'autres implémentations de ces deux utilitaires, pas seulement l'implémentation GNU.
Kusalananda

7

Cela fonctionnera bien; plus généralement, grepattendra lorsqu'un programme ne sort pas, et continuera à lire à mesure que la sortie arrive, donc si vous le faites:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Rien ne se passera pendant 5 secondes, puis grep affichera le "test" correspondant, puis cinq secondes plus tard, il se terminera lorsque le processus canalisé


7

Ajoutez --line-bufferedà grep, et cela peut réduire le délai pour vous. Très utile dans certains cas.

tail -f foo | grep --line-buffered bar

2
C'est utile lorsque la sortie de grepne va pas à un terminal (redirigée vers un autre type de fichier). la mise en mémoire tampon de ligne est la valeur par défaut lorsque la sortie est envoyée à un terminal, donc cela n'y fera aucune différence. Notez que cette option est spécifique à GNU.
Stéphane Chazelas


2

Je vois tous ces gens dire d'utiliser tail -f, mais je n'aime pas les limites de cela! Ma méthode préférée de recherche d'un fichier tout en surveillant les nouvelles lignes (par exemple, je travaille généralement avec des fichiers journaux auxquels sont ajoutés la sortie redirigée de processus exécutés périodiquement via des tâches cron) est:

 tail -Fn+0 /path/to/file|grep searchterm

Cela suppose GNU tail et grep. Détails de support de la page de manuel de queue (GNU coreutils, le mien est v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Ainsi, la partie de queue de ma commande équivaut à tail --follow --retry --lines=+0, où l'argument final lui ordonne de commencer au début, en sautant zéro ligne.


1
tail -f access | awk '/ADD/{print $0}'

Utilisez ce qui précède, je l'utilise habituellement.


0

Vous pouvez utiliser netcat pour récupérer les résultats de tail -f car les nouveaux résultats arrivent assez facilement.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Cela définit grep pour écouter les résultats des entrées provenant du port 1337.
La deuxième commande dirige la sortie de tail -f vers netcat et l'envoie localhost 1337. Pour le faire localement, vous devez changer ttys pour chacun des deux ensembles de commandes ou utilisez quelque chose comme un écran.


0

Ça marche. Mais attention à ce que la sortie ne soit plus instantanée: elle est tamponnée à travers le tube.


D'accord. Pour tester cela, ouvrez deux fenêtres. Exécuter tail -fdans une fenêtre et tail -f logfile | grep patterndans l'autre fenêtre. Les lignes contenant patternn'apparaissent pas toujours dans les deux fenêtres en même temps. J'ai vu des lignes apparaître à 30 secondes d'intervalle en de rares occasions, ce qui était ennuyeux.
Stefan Lasiewski

Cela pourrait avoir plus à voir avec le système qui bascule entre l'exécution de l'une ou l'autre instance de tail. Un meilleur test serait nous teeou quelque chose.
Kevin Cantu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.