Posez votre question Signaler

Shell : rediriger un pipe vers deux commandes [Résolu]

NegroTruc - Dernière réponse le 22 déc. 2011 à 12:31
Bonjour à tous,
Je cherche à savoir s'il est possible d'utiliser les pipes shell de façon à rediriger la sortie d'une première commande vers deux autres.
Mon exemple :
J'ai ce style de script :
grep test texte.log | cut -d" " -f10 > fich1.tmp
grep test texte.log | cut -d" " -f2 > fich2.tmp
Or le premier grep est très long car le fichier texte.log est très gros. J'aimerais éviter de repasser la commande deux fois.
Je peux toujours passer par un fichier intermédiare créé pour l'occasion, mais j'aimerais éviter et faire plus "propre" si possible.
Merci d'avance !
Lire la suite 

Shell : rediriger un pipe vers deux commandes »

12 réponses
Réponse
+1
moins plus
hello
avec awk
awk '/test/ { print $10 > "fich1.tmp" ; print $2 > "fich2.tmp"}' texte.log
Ajouter un commentaire
Réponse
+1
moins plus
il ne peut y avoir que le dernier avec > >(commande)
essayer
grep "Login" texte.log | grep -v super | tee >(cut -d" " -f12- | cut -d"[" -f1 > fich1.test) >(grep 10.20.30.40 | wc -l > fich2.tmp) > >(grep 50.60.70.80 | wc -l > fich3.tmp) 

en résumé
grep ... ¦ tee >(commande) >(commande) >(commande) ... > >(commande)
dubcek- 22 déc. 2011 à 12:09
tee ne fait que copier la sortie standard dans des fichiers
pour cette notation bash >(commande), voir Substitution de Processus
Char Snipeur- 22 déc. 2011 à 12:15
Dans ce cas là, la commande tee est superflue alors.
Je ne comprends pas le double > pour le dernier argument.
dubcek- 22 déc. 2011 à 12:31
tee copie dans un ou des fichiers ET sur stdout
sans le > final, il y aurait la sortie du grep dans le terminal
Ajouter un commentaire
Réponse
+0
moins plus
Ma commande d'origine n'est pas pas aussi simple malheureusement...
Mais bon, je n'ai "plus" qu'à apprendre comment fonctionne awk ! ^^"

Merci de ton aide.
Ajouter un commentaire
Réponse
+0
moins plus
montre nous la commande
Ajouter un commentaire
Réponse
+0
moins plus
avec 1 grep et plusieurs cut :
grep test texte.log | tee >(cut -d " " -f 10 >fich1.tmp) > >(cut -d " " -f 2 >fich2.tmp)
Ajouter un commentaire
Réponse
+0
moins plus
En utilisant les redirections tee de ton exemple, j'obtiendrais ça :

grep "Login" texte.log | grep -v super | tee >(cut -d" " -f12- | cut -d"[" -f1 > fich1.test) > >(grep 10.20.30.40 | wc -l > fich2.tmp) > >(grep 50.60.70.80 | wc -l > fich3.tmp) 


Ça à l'air de répondre à mon besoin. Je vais tester avec un time, pour vérifier si c'est vraiment plus efficace, mais il n'y a pas de raison ! :)

Merci !

EDIT : Arf, non, trois commandes, ça n'a pas l'air possible. Je cherche.
Ajouter un commentaire
Ce document intitulé « Shell : rediriger un pipe vers deux commandes » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?