Shell : rediriger un pipe vers deux commandes

Résolu/Fermé
NegroTruc - 21 déc. 2011 à 16:19
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 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 !
A voir également:

6 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 21/12/2011 à 16:37
hello
avec awk
awk '/test/ { print $10 > "fich1.tmp" ; print $2 > "fich2.tmp"}' texte.log
1
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 22/12/2011 à 10:32
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)
1
Oui je viens de voir ça. Cette fois, c'est bon et ça va nettement plus vite que de faire 3 grep !
Merci pour ton aide.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
22 déc. 2011 à 11:25
Cette façon de faire vient d'où ? je ne l'ai pas trouver dans la page man de tee.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
22 déc. 2011 à 11:32
Salut,

info tee ;-))
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 22/12/2011 à 12:12
tee ne fait que copier la sortie standard dans des fichiers
pour cette notation bash >(commande), voir Substitution de Processus
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
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.
0
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.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
21 déc. 2011 à 17:08
montre nous la commande
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
22 déc. 2011 à 08:03
avec 1 grep et plusieurs cut :
grep test texte.log | tee >(cut -d " " -f 10 >fich1.tmp) > >(cut -d " " -f 2 >fich2.tmp)
0
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.
0