IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Bash - Utilisation de awk


Sujet :

Shell et commandes GNU

  1. #21
    Invité
    Invité(e)
    Par défaut
    Bonsoir à tous,

    Effectivement je ne m'étais pas posé la question de garder ou non le curl en erreur.
    Spontanément je pensais le mettre pour voir ceux qui sont en erreur mais est ce que ça ne rajoute pas du parasite, à voir.

    Donc vu qu'on passe cette première partie on voit dans les captures que je vais bien dans le if avec "format_3"
    Le fichier temp est rempli mais rien après

  2. #22
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    C'est bien, le fichier temp est rempli mais de quoi donc ?

    A-t-il ce qu'il faut pour json_reformat ?

    si tu dis qu'avant avec le curl cela fonctionnait, donc ceci devrait fonctionner aussi (pour faire abstraction des redirection) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fichier | json_reformat | awk -F : '(NR<11){next;} { $3 = "" ; print $4}'> valeurs_def.json

  3. #23
    Invité
    Invité(e)
    Par défaut
    salut,
    Le fichier temp est rempli de valeurs par exemple:
    Nom : 143426.5.png
Affichages : 92
Taille : 5,1 Ko
    J'essaie avec le cat demain mais effectivement j'ai passé plus d'une journée à essayer de comprendre pourquoi si on fait tout en même temps que le curl ça marche et si on fait séparé non.
    ça reste un grand mystère à l'heure actuelle.

    Bonne soirée

  4. #24
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 679
    Par défaut
    ne fais pas de captures d'écran : c'est inutilisable.
    il vaut mieux faire des copier/coller.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #25
    Invité
    Invité(e)
    Par défaut
    Salut à tous,
    J'ai pas mal avancé sur le problème cette semaine.
    J'ai fait quelques changements comme rajouter le "json_reformat" à la suite du curl, ça a l'air de marcher maintenant.
    En testant le code je n'ai plus d'erreurs, mais certaines fois lors des curl la valeur 1 se met dans la variable codeErreur, alors que le curl à l'air de bien se faire: pas de message d'erreur, le compteur de tentative n'est pas incrémenté
    Et chose encore plus bizarre pour tous les autres curl qui suivent la valeur reste dans la variable errCode comme si elle gardait en mémoire la valeur.
    Il faut peut-être que j'écrase la valeur à chaque fois?

    Bonne fin d'après-midi

  6. #26
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Hello !
    As-tu essayé la proposition avec la boucle gérée en interne par "curl --retry" et qui permet de s'abstenir de gérer les codes de retour?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ! curl --retry ${maxRetry:-5} --retry-delay ${delay:-1} -o "$fichier" "$url"
    then echo "ça marche pô : $?" ; exit 1
    fi
     
    # Si on arrive ici, c'est que curl a bien réussi à récupérer le fichier.
    # On continue en formatant pour extraire l'info souhaitée
    if [ "$formatage" == "format_1" ]
       then
       ...
    fi
    Citation Envoyé par flash026 Voir le message
    Et chose encore plus bizarre pour tous les autres curl qui suivent la valeur reste dans la variable errCode comme si elle gardait en mémoire la valeur.
    Il faut peut-être que j'écrase la valeur à chaque fois?
    Je crois qu'il faudrait surtout que tu postes la version courante de ton script afin qu'on puisse voir s'il y a des problèmes, bugs ou améliorations à effectuer.

  7. #27
    Invité
    Invité(e)
    Par défaut
    Salut jack-ft,
    Voilà la version du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    curl(){
            url=$1
            formatage=$2
            echo "$1 - URL : "$url
            echo "$2 - formatage : "$formatage
            fichier=temp.json
            declare -i retry=0 maxRetry=5;
            until curl $url | json_reformat>$fichier|| errCode=$? && ((retry < maxRetry))
            do
                    retry+=1
                    sleep ${delay:-1}
            done
            ((retry >=maxRetry)) && {>&2 echo "$maxRetry , code echec: $errCode"
                    exit $errCode
            }
     
            if [ "$formatage" == "format_1" ]
            then
                    cat $fichier | sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g" > valeurs.json
     
            elif [ "$formatage" == "format_2" ]
            then
                    cat $fichier | sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g"| sed '1d' > valeurs.json
     
            elif [ "$formatage" == "format_3" ]
            then
                    cat $fichier | awk -F ":" '{ $1 = "" ; print $0 }'|sed '1,10d'>valeurs.json
            fi
     
            echo "code : " $errCode
            echo "retry : " $retry
            echo "maxRetry : " $maxRetry
     
    }
    Et par exemple dans cette exemple on voit qu'il y a eu un problème avec le curl et pourtant rien n'est rejoué car le compteur de tentative n'est pas incrémenté.
    De plus le la valeur 1 reste dans la variable ErrCode jusqu'à la fin de l'éxécution alors que les autres curl ont l'air de bien s'exécuter.
    C'est ce que j'ai du mal à comprendre on dirait qu'on récupére le code mais que le curl en erreur n'est pas re-executé
    Nom : 2987.png
Affichages : 83
Taille : 19,9 Ko

    Bon après-midi

  8. #28
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 679
    Par défaut
    tu ne dois pas mettre le json_reformat dans le until :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    until curl -o /tmp/sortieCurl.json "$url" || exCode=$? && ((retry>=max))
    do
       retry+=1
       sleep $delay
    done
     
    # condition de sortie du script
    ...
     
    # et ensuite
    json_reformat </tmp/sortieCurl.json | awk ...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #29
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    retry+=1
    Ce n'est pas du bash.

    until curl -o /tmp/sortieCurl.json "$url" || exCode=$? && ((retry>=max))
    do
    Même si le curl fonctionne, il va recommencer max fois, car le until va tester ce que renvoie le test. Et pas curl.

  10. #30
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 679
    Par défaut
    Ce n'est pas du bash.
    si si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ declare -i i
    $ i+=1
    $ echo $i
    1
    $ i+=1
    $ echo $i
    2
    il ne faut pas oublier le declare, sinon on obtiendrait 11
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #31
    Invité
    Invité(e)
    Par défaut
    Salut,
    Je n'ai pas utilisé le declare. Pourtant ça n'a pas l'air d'être gênant. En rajoutant le déclare la variable sera renitialisée à chaque fois ?
    Sans le déclare ce n'est pas du bash, mais alors qu'est-ce que c'est ?

    Je vais essayer d'enlever le json_reformat du until, par contre je ne comprends pas en quoi cela est problématique de le mettre là.

    Bonne journée

  12. #32
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Toutes mes excuses. Je me suis doublement trompé. Je ne pensais pas qu'il y avait une arithmétique en dehors de $(( )). Et on peut même faire les choses de façon naturelle quand la variable est déclarée en nombre entier. (concaténation pour les textes et addition pour les nombres)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ i=1
    $ i+=1
    $ echo $i
    11
    $ declare -i a
    $ a=1
    $ a+=1
    $ echo $a
    2
    $ a=a+1
    $ echo $a
    3
    $ i=i+1
    $ echo $i
    i+1

  13. #33
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 679
    Par défaut
    Je n'ai pas utilisé le declare. Pourtant ça n'a pas l'air d'être gênant.
    comme je l'ai montré, la concaténation de uns reste un nombre.

    En rajoutant le déclare la variable sera renitialisée à chaque fois ?
    non

    Sans le déclare ce n'est pas du bash, mais alors qu'est-ce que c'est ?
    si si, c'est du bash.

    Je vais essayer d'enlever le json_reformat du until, par contre je ne comprends pas en quoi cela est problématique de le mettre là.
    on veut tester le curl.
    à ce stade, il est inutile de refaire le formatage du JSON.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #34
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Alors je suis arrivé à faire fonctionner le Curl en séparant le json_reformat.
    C'est vrai que c'est logique de séparer les deux actions car ça ne sert à rien de faire du reformat si la requête n'aboutit pas.

    Mais après je pense que mon problème est toujours d'actualité (cf capture plus haute) ou un Curl tombe en erreur et que pourtant il n'est pas re exécuté, avec la valeur qui reste dans errCode.

    Bon week-end à tous

  15. #35
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 679
    Par défaut
    c'est le sens de l'inégalité qui est erroné.

    on lit :
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    jusqu'à curl (isOK) OU assigner errCode ET retry inférieur_à maxRetries
    alors que ça doit être jusquà ... retry supérieur_à maxRetries
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #36
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Et moi j'insiste:
    ce que son until fait quand curl est toujours ko:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ declare -i retry=0 max=5;until { echo ko; false ;} ||  echo assigne  && ((retry>=max)) ; do retry+=1 ; done
    ko
    assigne
    ko
    assigne
    ko
    assigne
    ko
    assigne
    ko
    assigne
    ko
    assigne
    Là, on est ok.

    Par contre, quand le curl est ok, on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ declare -i retry=0 max=5;until { echo ok; true ;} ||  echo assigne  && ((retry>=max)) ; do retry+=1 ; done
    ok
    ok
    ok
    ok
    ok
    ok
    Ce qui veut dire qu'on charge tout le temps 6 fois le même url, qu'il soit vrai ou faux, et que c'est uniquement le dernière qui compte quelque soit le résultat.
    Alors que l'on devrait avoir ceci quand curl est vrai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ declare -i retry=0 max=5;until { echo ok; true ;} || {  echo assigne  && ((retry>=max)) ;} ; do retry+=1 ; done
    ok
    Et quand curl est toujours faux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ declare -i retry=0 max=5;until { echo ko; false ;} || {  echo assigne  && ((retry>=max)) ;} ; do retry+=1 ; done
    ko
    assigne
    ko
    assigne
    ko
    assigne
    ko
    assigne
    ko
    assigne
    ko
    assigne
    Là, on a une vrai boucle retry...

  17. #37
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 679
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 679
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ declare -i retries=1; max=5; until curl -o "$sortie" "$url" || ((lastErrCode=$?, retries>=max)); do retries+=1; done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #38
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Ca semble bien marcher maintenant.
    Il fallait juste changer les parenthèses.
    Merci beaucoup pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Script Bash : Utilisation de awk dans une bouble for
    Par Emeric974 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/07/2013, 07h32
  2. [ksh et/ou bash] Utilisation des arguments type -d
    Par novices dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 24/11/2007, 14h04
  3. Utilisation de AWK
    Par dim001 dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 08/10/2007, 18h40
  4. [bash] utilisation de CAT/AWK pour parser un fichier CSV
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 32
    Dernier message: 25/07/2007, 23h34
  5. [bash] utilisation de passwd
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 23/07/2007, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo