42 votes

tuyau d'échappement au tuyau de GREP à un autre GREP semble être un tuyau trop loin

Fondamentalement, je me demande pourquoi cela n'a pas de sortie du tout:

tail --follow=name file.txt | grep something | grep something_else 

Vous pouvez supposer qu'il devrait produire un résultat, j'ai une autre ligne à confirmer

cat file.txt | grep something | grep something_else

Il semble que vous ne pouvez pas rediriger la sortie de la queue plus d'une fois!? Quelqu'un sait ce que la face est et est-il une solution?

EDIT: Pour répondre aux questions jusqu'à présent, le fichier a vraiment le contenu qui doit être affiché par la commande grep. À titre de preuve si la commande grep est fait comme suit:

tail --follow=name file.txt | grep something

La sortie s'affiche correctement, mais si c'est utilisé à la place:

tail --follow=name file.txt | grep something | grep something

Aucune sortie n'est montré.

Si utile, je suis sous ubuntu 10.04

89voto

simonc Points 506

Vous pouvez également rencontrer un problème de mise en mémoire tampon grep lorsque vous vous trouvez dans un canal. c'est-à-dire que vous ne voyez pas le résultat de

    tail --follow=name file.txt | grep something > output.txt
 

puisque grep mettra sa propre sortie en tampon

Utilisez le commutateur --line-buffered de grep pour résoudre ce problème:

 tail --follow=name file.txt | grep --line-buffered something > output.txt
 

Ceci est utile si vous souhaitez obtenir les résultats de la suite dans le fichier output.txt aussi rapidement que possible.

6voto

radman Points 3430

Compris ce qui se passait ici. Il s'avère que la commande fonctionne, c'est juste que la sortie prend beaucoup de temps pour atteindre la console (env 120 secondes dans mon cas). C'est parce que le tampon sur le standard n'est pas écrit chaque ligne, mais plutôt de chaque bloc. Ainsi, au lieu de chaque ligne du fichier qui était écrit, je voudrais obtenir un géant de bloquer toutes les 2 minutes.

Il convient de noter que cela fonctionne correctement:

tail file.txt | grep something | grep something

C'est la suite du fichier avec l' --follow=name qui est problématique.

Pour ma part, j'ai trouvé un moyen de contourner cela, ce que j'avais l'intention de faire était de capturer la sortie de la première grep à un fichier, la commande serait:

tail --follow=name file.txt | grep something > output.txt

Un moyen de contourner cela est d'utiliser l' script de commande comme ceci:

script -c 'tail --follow=name file.txt | grep something' output.txt

Le Script récupère la sortie de la commande et de l'écrit dans le fichier, évitant ainsi le deuxième tube.

Cela a effectivement travaillé autour de la question pour moi, et j'ai expliqué pourquoi la commande ne fonctionnait pas comme je m'y attendais, le problème est résolu.

Pour info, Ces autres stackoverflow les questions sont liées:
Astuce une demande en pensant à son stdin est interactif, et non d'une pipe
La Force d'un autre programme standard de la sortie de la mémoire sans tampon à l'aide de Python

-1voto

geekosaur Points 26170

Vous savez que tail commence par défaut avec les dix dernières lignes du fichier? Je suppose que tout ce que la version cat trouvée se trouve est bien passé. Essayez tail -n+1 --follow=name file.txt pour commencer depuis le début du fichier.

-1voto

Billy Moon Points 21439

fonctionne pour moi sur Mac sans --follow=name

 bash-3.2$ tail delme.txt | grep po
position.bin
position.lrn
bash-3.2$ tail delme.txt | grep po | grep lr
position.lrn
 

-1voto

Sanjay Points 11

grep pattern nomfichier | motif grep | motif grep | modèle grep ......

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X