Question Comment «grep» un flux continu?


Est-ce possible d'utiliser grep sur un flux continu?

Ce que je veux dire est une sorte de tail -f <file> commande, mais avec grep sur la sortie afin de ne garder que les lignes qui m'intéressent.

J'ai essayé tail -f <file> | grep pattern mais il semble que grep ne peut être exécuté qu'une seule fois tail finit, c'est-à-dire jamais.


573
2017-08-23 13:34


origine


Réponses:


Allumer greple mode de mise en mémoire tampon des lignes lors de l'utilisation de grep BSD (FreeBSD, Mac OS X, etc.)

tail -f file | grep --line-buffered my_pattern

Vous n'avez pas besoin de faire cela pour GNU grep (utilisé sur presque tous les Linux) car il videra par défaut (YMMV pour les autres goûts Unix tels que SmartOS, AIX ou QNX).


1060
2017-08-23 14:44



Je utilise l tail -f <file> | grep <pattern> tout le temps.

Il attendra jusqu'à ce que les flushs de grep, pas jusqu'à ce qu'il se termine (j'utilise Ubuntu).


104
2017-08-23 13:37



Je pense que votre problème est que grep utilise un tampon de sortie. Essayer

tail -f file | stdbuf -o0 grep my_pattern

il mettra le mode de tamponnage de sortie de grep à unbuffered.


50
2017-08-23 13:58



Dans la plupart des cas, vous pouvez tail -f /var/log/some.log |grep foo et ça marchera très bien.

Si vous devez utiliser plusieurs greps sur un fichier journal en cours d'exécution et que vous ne trouvez aucune sortie, vous devrez peut-être --line-buffered passer dans votre milieu grep (s), comme ça:

tail -f /var/log/some.log | grep --line-buffered foo | grep bar

5
2018-05-04 17:14



Si vous voulez trouver des correspondances dans le tout fichier (pas seulement la queue), et vous voulez qu'il s'asseoir et attendre de nouveaux matches, cela fonctionne bien:

tail -c +0 -f <file> | grep --line-buffered <pattern>

le -c +0 drapeau dit que la sortie devrait commencer 0 octets (-c) Depuis le début (+) du fichier.


4
2017-09-11 22:34



vous pouvez considérer cette réponse comme une amélioration .. habituellement j'utilise

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-F est meilleur en cas de rotation du fichier (-f ne fonctionnera pas correctement si le fichier est pivoté)

-A et -B est utile pour obtenir des lignes juste avant et après l'occurrence du modèle .. ces blocs apparaîtront entre les séparateurs de lignes en pointillés


1
2017-07-27 23:39



Oui, cela fonctionnera très bien. Grep et la plupart des commandes Unix fonctionnent sur les flux une ligne à la fois. Chaque ligne qui sort de la queue sera analysée et transmise si elle correspond.


0
2017-08-23 13:41