3 votes

Le grep ne parvient pas à s'ouvrir à un tuyau ?

J'ai des problèmes avec le filtrage grep de la sortie de make. En particulier,

make target 2>&1 | grep -E --color=never "^make.*"

fonctionne comme prévu, mais ce qui suit n'affiche aucune donnée dans la console :

make target 2>&1 | grep -E --color=never "^make.*" | cat

Ai-je raté quelque chose d'évident ? Pourquoi la première commande sort-elle mais pas la seconde ? S'agit-il d'une sorte de mise en mémoire tampon des entrées-sorties ? Ou suis-je simplement stupide ?

[EDIT] : cat n'est qu'un exemple de test minimum pour la commande réelle que je veux utiliser.

[EDIT] : Cela ne semble pas être un problème avec grep, car en le remplaçant par ack entraîne le même comportement.

[EDIT] : script que le chat remplace :

#!/bin/bash
cat - \
 | grep -E --color=never "^.*warning:.*|^.*error:.*|^make.*[Ee]rror.*|^make.*" \
 | hilite.sh -r "^.*warning:.*" -f yellow -B \
 | hilite.sh -r "^.*error:.*" -f red -B \
 | hilite.sh -r "^make.*[Ee]rror.*" -f red -B \
 | hilite.sh -r "^make.*" -f magenta

[EDIT] : Je pense qu'il s'agit d'un problème de mémoire tampon/IO. Je laisse le build tourner pendant le w/e et je verrai s'il finit par obtenir la sortie là où il le faut !

6voto

vianna77 Points 3505

Probable grep détecte qu'il n'écrit pas vers un TTY, et met donc en mémoire tampon plus de sorties, au lieu de fonctionner dans son mode habituel de mise en mémoire tampon des lignes (c'est-à-dire que vous voyez chaque ligne au fur et à mesure qu'elle est trouvée). Ce comportement est plus efficace car il entraîne moins de write() mais si vous êtes un utilisateur qui attend une sortie en pipeline, cela peut être un peu trompeur.

Si vous utilisez GNU grep (et d'après votre étiquette linux, je suppose que vous l'êtes), consultez le site --line-buffered qui obligera les utilisateurs à utiliser l'option grep pour travailler dans le mode plus familier de la mise en mémoire tampon des lignes. Cela pourrait techniquement diminuer les performances de grep (comme indiqué dans la page de manuel), mais comme vous regardez la sortie d'une version live, je doute que cela fasse une différence à cet égard.

1voto

Abral Points 41

Je ne suis pas sûr de ce que votre commande est censée faire, cat tous les fichiers qui ont make.* dans leur nom de fichier ?

Essayez de modifier le cat para xargs cat ?

1voto

Unnati Gutpa Points 11

Vous pouvez essayer d'expérimenter avec unbuffer , par exemple,

make target 2>&1 | unbuffer -p grep -E --color=never "^make.*" | cat

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X