View previous topic :: View next topic |
Author |
Message |
TTK Guru
Joined: 02 Mar 2004 Posts: 523
|
Posted: Wed Jan 05, 2005 9:06 pm Post subject: [shell] dupliquer stdout ? |
|
|
Salut
Je cherche un moyen de rediriger la sortie standard d'une commande vers 2 autres commandes. En fait, il faudrait une sorte de tee mais qui redirige vers une commande et non un fichier.
Genre: cat gros_fichier | tee 'filtre1' | filtre2
Je suis pas sur d'être tres clair là ..
Merci |
|
Back to top |
|
|
Trevoke Advocate
Joined: 04 Sep 2004 Posts: 4099 Location: NY, NY
|
Posted: Wed Jan 05, 2005 9:20 pm Post subject: |
|
|
Euh... redirige vers un fichier et ensuite utilise ce fichier comme input pour les deux filtres?
Tu veux utiliser le deuxieme filtre sur l'output du premier? Dans ce cas une double pipe devrait suffire (en tout cas, apres ca moi je suis rompu, har har).
Si tu veux utiliser les deux filtres separement, alors je sens venir un mini shell script.. Ou alors deux commandes separees. _________________ Votre moment detente
What is the nature of conflict? |
|
Back to top |
|
|
sireyessire Advocate
Joined: 20 Mar 2003 Posts: 2991 Location: back in Paris, France
|
Posted: Wed Jan 05, 2005 9:21 pm Post subject: |
|
|
je suppose que ces 2 commandes doivent être éxécutés en parallèle et pas en série, ou j'ai rien compris? _________________ I never think of the future. It comes soon enough.
Albert Einstein
Try simpler first
Shockley |
|
Back to top |
|
|
TTK Guru
Joined: 02 Mar 2004 Posts: 523
|
Posted: Wed Jan 05, 2005 9:37 pm Post subject: |
|
|
Oui, il faut bien executer ces commandes en parallele. Le but est de ne lire le fichier qu'une fois.
L'exemple typique ct quand je faisais:
Code: |
cat *.VOB | tcextract -x mpg -t vob > truc.m2v
cat *.VOB | tcextract -x ac3 -a 1 -t vob > truc.ac3
mplex truc.mpg truc.m2v truc.ac3
|
Et ce pb m'arrive souvent. Là c'est un peu plus tortueux, mais l'idée est la même. 2 traitements en parallele sur un fichier. J'ai pas envie de faire un script perl. Mon fichier est binaire en plus.
Bye |
|
Back to top |
|
|
xaviermiller Bodhisattva
Joined: 23 Jul 2004 Posts: 8710 Location: ~Brussels - Belgique
|
Posted: Thu Jan 06, 2005 8:32 pm Post subject: |
|
|
et tee ? _________________ Kind regards,
Xavier Miller |
|
Back to top |
|
|
Trevoke Advocate
Joined: 04 Sep 2004 Posts: 4099 Location: NY, NY
|
Posted: Thu Jan 06, 2005 9:09 pm Post subject: |
|
|
man tee
info coreutils tee
(juste au cas ou, faut dire qu'il est pas clair le monsieur ) _________________ Votre moment detente
What is the nature of conflict? |
|
Back to top |
|
|
Pachacamac Veteran
Joined: 22 Nov 2003 Posts: 1264 Location: Paris - France
|
Posted: Thu Jan 06, 2005 9:12 pm Post subject: |
|
|
Quote: | Mon fichier est binaire en plus. |
C'est à dire ?
avec le C tu as fork() pour dupliquer les processus. |
|
Back to top |
|
|
TTK Guru
Joined: 02 Mar 2004 Posts: 523
|
Posted: Thu Jan 06, 2005 11:32 pm Post subject: |
|
|
XavierMiller wrote: | et tee ? |
Ben comme je disais dans mon premier post, c'est un genre de tee que je recherche, ou une syntaxe magique pour tee. Parce que tee ne sait rediriger que vers un fichier.
Peut etre avec un coprocess ? Je lance un filtre en coprocess, puis mon cat pipé sur un tee vers le dev correspondant au stdin de mon coprocess en attente de données ?
Qqun a une idee de syntaxe pour tout ca ? |
|
Back to top |
|
|
gim Guru
Joined: 29 Apr 2003 Posts: 418 Location: milky-way
|
Posted: Fri Jan 07, 2005 2:54 am Post subject: |
|
|
Quote: | Qqun a une idee de syntaxe pour tout ca ? |
J'ai essayé de trouver, mais les shells sont vraiments trop mal faits....
Alors j'ai fait une commande en C (dup.c):
Code: | #include <sys/types.h>
#include <unistd.h>
char *buf[1024];
int pipe1[2], pipe2[2];
int main (int argc, char *argv[])
{
int s;
pid_t p1, p2;
if (argc != 3) {
printf("usage: %s filtre1 filtre2\n", argv[0]);
return 1;
}
pipe(pipe1); pipe(pipe2);
if ((p1 = fork ()) == 0) {
close(pipe2[0]); close(pipe2[1]);
close(pipe1[1]);
close(0); dup2(pipe1[0],0); close(pipe1[0]);
execl("/bin/sh", "/bin/sh","-c",argv[1]);
}
else if ((p2 = fork ()) == 0) {
close(pipe1[0]); close(pipe1[1]);
close(pipe2[1]);
close(0); dup2(pipe2[0],0); close(pipe2[0]);
execl("/bin/sh", "/bin/sh","-c",argv[2]);
}
else {
close(pipe1[0]); close(pipe2[0]);
while((s = read(0,buf,1024)) != 0)
{
write (pipe1[1],buf,s);
write (pipe2[1],buf,s);
}
close(pipe1[1]); close(pipe2[1]);
waitpid(p1,0,0); waitpid(p2,0,0);
}
return 0;
}
|
J'améliorerai ça un autre jour
Un petit coup de gcc dup.c -o dup et hop:
Code: | $ dup
usage: dup filtre1 filtre2 |
les filtres sont interprétés par /bin/sh.
par exemple:
Code: | $ echo $(seq 0 9) | dup 'cat' 'rev | tr 0-9 A-Z' |
les deux filtres sont executés en parallèle et leurs sorties standard entrelacées:
Code: | $ dup 'yes 1' 'yes 2' |
++ |
|
Back to top |
|
|
TTK Guru
Joined: 02 Mar 2004 Posts: 523
|
Posted: Fri Jan 07, 2005 7:52 am Post subject: |
|
|
Ah bah ça c'est sympa. Merci !
En plus ça marche. Ptet que je vais augmenter le buffer parce que mon fichier d'entrée fait 500 megs ...
L'aviation civile te remercie de ta contribution à l'automatisation de l'analyse des statistiques de trafic aérien en RP
Tshaw |
|
Back to top |
|
|
|