[shell] script appellé par un pipe, stocker la donnée d'entrée?

script appellé par un pipe, stocker la donnée d'entrée? [shell] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 24-03-2004 à 18:34:21    

Salut,
 
J'ai un script qui est appellé avec un pipe. j'aimerais savoir comment stocker les données en entrée dans une variable?
 
j'ai un test avec grep à faire, et si je fais :
 
if cat | grep -q "pattern"
 
ensuite il n'y a plus rien dans cat puisque le flux a été envoyé dans grep, or j'en ai encore besoin ensuite (pour faire une action en fonction du test).
 
C'est pas clair?
 
 
j'aimerais en gros faire ceci :
 
if cat | grep -q "pattern"
then
cat > output1.txt # mais là cat est vide
else
cat > output2.txt # et là aussi  
fi
 
comment faire? (il existe peut-être une autre façon de faire le grep sans niquer le flux)


Message édité par duch le 24-03-2004 à 18:58:44
Reply

Marsh Posté le 24-03-2004 à 18:34:21   

Reply

Marsh Posté le 24-03-2004 à 18:53:24    

Et en passant betement par un fichier temp ? Tu peux utiliser les données autant de fois que tu veux ensuite.

Reply

Marsh Posté le 24-03-2004 à 18:58:32    

pô bô :D
 
non il risque d'y avoir pas mal de fichier temp en même temps dans mon cas (c'est un filtre pour postfix), donc difficile à gerer.


Message édité par duch le 24-03-2004 à 18:59:40
Reply

Marsh Posté le 24-03-2004 à 21:18:10    

Et en utilisant $?
cat file|grep -q "pattern"
if $?
then
....

Reply

Marsh Posté le 24-03-2004 à 22:48:42    

Si tu tiens à conserver ton flux de données, je ne vois pas d'autre solution que de passer par un fichier temporaire comme l'a indiqué AirbaT.
Le nom du fichier doit être différent pour chaque exécution, pour cela il suffit d'y inclure le pid.
 
TempFile=/tmp/$(basename $0).$$
cat > $TempFile
if grep -q "pattern" $TempFile
then
 . . .
fi
rm -f $TempFile
 
ou
 
TempFile=/tmp/$(basename $0).$$
if tee $TempFile | grep "pattern" > /dev/null
then
 . . .
fi
rm -f $TempFile
 
On ne peut pas utiliser 'grep -q' avec 'tee' car le grep arrête de lire stdin dées qu'il à trouvé le pattern, du coup tee peut se planter en 'broken pipe'
 
 


---------------
Jean Pierre.
Reply

Marsh Posté le 24-03-2004 à 22:51:20    

David07 a écrit :

Et en utilisant $?
cat file|grep -q "pattern"
if $?
then
....


 
 
j'crois qu'on s'est pô compris, je ne cherche pas à récupérer le résultat du grep mais à pouvoir faire un grep sur le flux du stdin sans le perdre


Message édité par duch le 24-03-2004 à 22:52:37
Reply

Marsh Posté le 24-03-2004 à 22:55:47    

merci aigles pour cette solution.
 
Je préferais ne pas passer par un fichier temporaire, mais si c'est là seule soluce
 
j'vais essayer ça.

Reply

Marsh Posté le 24-03-2004 à 22:57:10    

Quels traitements veux tu faire sur le flux de données ?


---------------
Jean Pierre.
Reply

Marsh Posté le 24-03-2004 à 22:59:57    

la commande tee ne peut pas t'aider?

Reply

Marsh Posté le 24-03-2004 à 23:02:38    

je le pipe vers un autre script si une condition est remplie, sinon je sors du script.
 
En tous cas la soluce du fichier temporaire fonctionne, mais sans rien que pour le fun, c'est mieux

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed