Pourquoi grep ne fonctionne-t-il pas avec la redirection?

15

L'utilisation de la topcommande avec redirection fonctionne très bien:

top > top.log

Maintenant, je veux utiliser grep pour filtrer une certaine ligne:

top | grep "my_program" > top.log

Mais le fichier journal restera vide. Mais grep fournit une sortie lors de l'utilisation

top | grep "my_program"

my_programdoit être remplacé par un programme en cours d'exécution pour voir une sortie.

Pourquoi mon approche ne fonctionne-t-elle pas? Et comment puis-je le réparer?


la source
2
Je viens de l'essayer et cela fonctionne pour moi. Cependant, vous devriez probablement regarder l' -boption topou utiliser à la psplace.
Lev Levitsky
-bn'a pas résolu mon problème, mais a résolu quelques problèmes d'encodage. Je vous remercie.

Réponses:

22

J'ai le même comportement que vous décrivez. Sur Ubuntu 11.10

top | grep "my_program" > top.log

ne produit aucune sortie.

Je crois que la raison en est que grep met en mémoire tampon sa sortie. Pour dire à GNU grep de cracher la sortie ligne par ligne, utilisez l' --line-bufferedoption:

top | grep --line-buffered "my_program" > top.log

Voir également cette question SO pour d'autres solutions potentielles.

unutbu
la source
3
+1 --line-bufferedrésout le problème.
Merci, cela résout le problème pour moi aussi. L' -boption est également un bon conseil de Lev Levitsky. Cela a résolu certains problèmes de codage avec le fichier journal.
2

Tu devrais utiliser:

top -n 1 | grep "blah" > top.log

le "-n 1" fonctionne en haut pour une itération puis se ferme au lieu de se mettre à jour continuellement toutes les quelques secondes

puisque vous cherchez juste une ligne bien que ps soit un meilleur outil à utiliser.

h3rrmiller
la source
1

Ma solution de contournement pour ce problème était:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

De cette façon, je pourrais avoir un moniteur en cours d'exécution en arrière-plan pour mon_programme et conserver tous les résultats dans le fichier top.log.

Alex Sed
la source
0

Bien que les deux fonctionnent pour moi, je pense que les conseils de Lev Levitsky sont les bons. Utilisez le-b argument.

Il y a de fortes chances que la redirection de sortie soit le problème et que vous n'obteniez rien via stdout, essayez donc ceci à la place:

top -b 2>&1 | grep "my_program" > top.log

Notez que vous pourriez également avoir des problèmes avec la mise en mémoire tampon de sortie. Votre shell n'écrira pas constamment dans le fichier, il peut donc prendre un certain temps pour top.logse remplir.

Wolph
la source