Debian Debian-France Debian-Facile Debian-fr.org Debian-fr.xyz Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 26-01-2021 16:25:05

moreje
Membre
Distrib. : jessie
Noyau : 3.16.0-4-amd64
Inscription : 18-03-2016

script avec redirection et enchainements

Bonjour,
j'ai l' enchainement de commandes suivant:

CMD1 | awk '{ FS = ":" } ; {ORS="\n"} ; {print $2}'  >> toto.txt



lorsque CMD1 passe bien, pas de soucis, mon fichier toto.txt s'incrémente bien
mais j'aimerais que quand CMD1 échoue, j'aie une ligne ND qui s'ajoute

j'ai essayé:

CMD1 | awk '{ FS = ":" } ; {ORS="\n"} ; {print $2}'  >> toto.txt     ||  printf "%s\n" "ND" >> toto.txt    




mais ça ne marche pas

Avez vous une idée??

Merci
J

Hors ligne

#2 26-01-2021 18:43:38

otyugh
CA Debian-Facile
Lieu : Quimperlé/Arzano
Distrib. : Debian Stable
Inscription : 20-09-2016
Site Web

Re : script avec redirection et enchainements

Ta deuxième commande fonctionnerai si awk retournait un code non égal à 0, ce qui n'est pas le cas.

Faudrait le faire en utilisant la synthaxe conditionnelle de awk, ça devrait pas être compliqué "si $2 vide alors X sinon Y".
Sauf que vu que je fais du awk 1 fois par an, compte pas sur moi pour t'en donner la synthaxe !

Dernière modification par otyugh (26-01-2021 18:44:51)


datalove-datalove-s1-2.png agendadulibre-lagendadulibre.png arzinfo-arzinfo.png

Hors ligne

#3 26-01-2021 18:46:00

vv222
Administrateur
Lieu : Bretagne
Distrib. : GNU/Linux Debian « Sid »
Noyau : Linux ≥ 5.10 (amd64)
(G)UI : Openbox
Inscription : 18-11-2013
Site Web

Re : script avec redirection et enchainements

Le souci ici c'est que l'opérateur '||' agit en fonction du code de retour de awk, pas celui de CMD1.

Voici une proposition passant par un code de retour stocké dans une variable, mais il y a sûrement d'autres manières de gérer ça :

{ CMD1 ; CMD1_STATUS=$? ; } | awk '{ FS = ":" } ; {ORS="\n"} ; {print $2}' >> toto.txt
[ $CMD1_STATUS -eq 0 ] || printf "%s\n" "ND" >> toto.txt


Jouer sous Debian ? Facile !

Hors ligne

#4 27-01-2021 10:33:37

moreje
Membre
Distrib. : jessie
Noyau : 3.16.0-4-amd64
Inscription : 18-03-2016

Re : script avec redirection et enchainements

Merci,
je vais tester cette solution.
l'option conditionnelle de awk ne devrait pas fonctionner pusque à mon avis, awk ne s execute pas du fait de l'echec de CMD1
en fait, je me demandais s'il n'etait pas possible d'avoir un code retour pour l'ensemble ( CMD1 | awk ) ??

Hors ligne

#5 27-01-2021 18:01:41

moreje
Membre
Distrib. : jessie
Noyau : 3.16.0-4-amd64
Inscription : 18-03-2016

Re : script avec redirection et enchainements

Bon, j'ai fini par m'en sortir, mais je suis pas vraiment satisfait de ma methode, d'autant que j'ai pas compris pourquoi elle marche:

[ ! -e File1 ] || CMD1 File1 | awk '{ FS = ":" } ; {ORS="\t"} ; {print $2}' >> toto.txt || echo suite && printf "%s\t" "ND" >> toto.txt



j'ai bien le comportement voulu, mais je n'arrive pas a comprendre pourquoi j'ai du insérer ** || echo suite && **

vous avez une idée?
merci

Hors ligne

#6 28-01-2021 00:12:07

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 12-08-2015

Re : script avec redirection et enchainements

Tu as écris ceci :

Si le résultat de [ ! -e File1 ] est faux alors si le résultat de "CMD1 File1 | awk '{ FS = ":" } ; {ORS="\t"} ; {print $2}'" est faux alors exécute "echo suite"
Si le résultat de [ ! -e File1 ] est vrai alors exécute "printf "%s\t" "ND""


Tu pourrais aussi l'écrire avec des if then else fi... quelque chose comme ceci : (Pas testé: à vérifier)

( if [ ! -e "File1" ]; then
   printf "%s\t" "ND"
 elif  ! CMD1 File1 | awk -F":" '{printf "%s\t" , $2}' ; then
   echo suite
 fi ) >> toto.txt


Ou en plus compact : (A vérifier)

( [ ! -e File1 ] && printf "%s\t" "ND" || CMD1 File1 | awk -F":" '{printf "%s\t" , $2}'; [ ${PIPESTATUS} -ne 0 ] &&  echo suite ) >> toto.txt


.

Dernière modification par Beta-Pictoris (28-01-2021 01:29:18)

Hors ligne

#7 28-01-2021 00:25:56

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 12-08-2015

Re : script avec redirection et enchainements

vv222 a écrit :

Le souci ici c'est que l'opérateur '||' agit en fonction du code de retour de awk, pas celui de CMD1.

Voici une proposition passant par un code de retour stocké dans une variable, mais il y a sûrement d'autres manières de gérer ça :

{ CMD1 ; CMD1_STATUS=$? ; } | awk '{ FS = ":" } ; {ORS="\n"} ; {print $2}' >> toto.txt
[ $CMD1_STATUS -eq 0 ] || printf "%s\n" "ND" >> toto.txt


Oui, avec bash, le tableau PIPESTATUS fournit un code de retour en fonction de la postion dans la pipeline.
.

Dernière modification par Beta-Pictoris (28-01-2021 01:29:25)

Hors ligne

#8 28-01-2021 09:11:49

moreje
Membre
Distrib. : jessie
Noyau : 3.16.0-4-amd64
Inscription : 18-03-2016

Re : script avec redirection et enchainements

Beta-Pictoris a écrit :

vv222 a écrit :

Le souci ici c'est que l'opérateur '||' agit en fonction du code de retour de awk, pas celui de CMD1.

Voici une proposition passant par un code de retour stocké dans une variable, mais il y a sûrement d'autres manières de gérer ça :

{ CMD1 ; CMD1_STATUS=$? ; } | awk '{ FS = ":" } ; {ORS="\n"} ; {print $2}' >> toto.txt
[ $CMD1_STATUS -eq 0 ] || printf "%s\n" "ND" >> toto.txt


Oui, avec bash, le tableau PIPESTATUS fournit un code de retour en fonction de la postion dans la pipeline.
.



Avec cette methode je n'ai pas réussi a updater $CMD1_STATUS. Peut etre parce que CMD1 n'est pas une commande bash, mais un executable (j'avais mis CMD1 pour simplifier)

Hors ligne

#9 28-01-2021 09:18:47

moreje
Membre
Distrib. : jessie
Noyau : 3.16.0-4-amd64
Inscription : 18-03-2016

Re : script avec redirection et enchainements

Beta-Pictoris a écrit :

Tu as écris ceci :

Si le résultat de [ ! -e File1 ] est faux alors si le résultat de "CMD1 File1 | awk '{ FS = ":" } ; {ORS="\t"} ; {print $2}'" est faux alors exécute "echo suite"
Si le résultat de [ ! -e File1 ] est vrai alors exécute "printf "%s\t" "ND""


Tu pourrais aussi l'écrire avec des if then else fi... quelque chose comme ceci : (Pas testé: à vérifier)

( if [ ! -e "File1" ]; then
   printf "%s\t" "ND"
 elif  ! CMD1 File1 | awk -F":" '{printf "%s\t" , $2}' ; then
   echo suite
 fi ) >> toto.txt


Ou en plus compact : (A vérifier)

( [ ! -e File1 ] && printf "%s\t" "ND" || CMD1 File1 | awk -F":" '{printf "%s\t" , $2}'; [ ${PIPESTATUS} -ne 0 ] &&  echo suite ) >> toto.txt


.



oui, j'avais bien pensé à la boucle if effectivement, et en fait, avec cette méthode, pas besoin de la partie

echo suite



ce que je ne comprends toujours pas, dans ma premiere version, c'est que "echo suite", je ne le vois pas s’exécuter (d'ailleurs j'en ai pas besoin), mais par contre, il est nécessaire pour que "printf "%s\t" "ND" s'exécute scratchhead.gif

je vais tester ta forme compacte...

Hors ligne

#10 28-01-2021 20:00:43

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 12-08-2015

Re : script avec redirection et enchainements

Ton awk renvoi vrai (code retour 0), la partie "|| echo suite" est donc passée.

Par contre, la partie après le "&&" est exécutée.

Dernière modification par Beta-Pictoris (28-01-2021 20:01:20)

Hors ligne

Pied de page des forums