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. #1
    Invité
    Invité(e)
    Par défaut Bash - Utilisation de awk
    Bonsoir,

    J'avais un curl qui fonctionnait de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl url | json reformat |awk -F ":" '{$1 = "" ; print $0}' | sed '1,10d' > sortie.json

    J'ai dû créer une fonction et maintenant le curl se fait en 2 étapes.

    -le curl simple
    -Le formatage

    Maintenant je fais:

    Un curl où la sortie est insérée dans le fichier fichierTemporaire

    Puis dans un second temp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    json reformat<$fichierTemporaire | |awk -F ":" '{$1 = "" ; print $0}' $fichierTemporaire| sed '1,10d' > sortie.json
    Le problème c'est que maintenant sortie.json est vide comme si à partir du awk plus rien ne se fait.

    J'ai pas mal cherché mais je ne trouve rien, avez-vous une idée?

    Merci par avance de votre aide.

    Bonsoir
    Dernière modification par Invité ; 11/08/2021 à 22h00. Motif: Déplacement dans le bon forum + Ajout des balises [CODE] mon code [/CODE] (bouton #)

  2. #2
    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
    Bonjour

    Prends le temps de comprendre ce que tu fais. Les commandes prennent en entrée du texte, et donnent en sortie du texte. Toute commande peut prendre un fichier en entrée et envoyer un fichier en sortie. Pour éviter la démultiplication des fichiers temporaires, on permet une conduite (pipe). Cette technique permet de relier la sortie standard d'une commande à l'entrée de la suivante, sans fichier temporaire. Les 2 codes suivants sont équivalents dans le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    commande1 > temp.txt
    commande2 < temp.txt
    rm -f temp.txt
    Lorsque tu donnes "$fichierTemporaire" comme cible à "awk", tout ce qui vient de la conduite est ignorée. De la même manière, si tu écris json reformat<$fichierTemporaire | |awk -F ":" '{$1 = "" ; print $0}' | sed '1,10d' $fichierTemporaire, je suis persuadé que tu auras $fichierTemporaire amputé des 10 première lignes, et le début de la conduite a été ignorée (par sed).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour
    Alors si il y a équivalence Entre les < et les | ça veut dire que je n'ai pas besoin de donner de fichier à awk.
    Donc seulement faire json reformat<$fichier_temp | awk....|Sed.....
    Le problème c'est que j'ai déjà essayé et même résultat rien ne se passe

  4. #4
    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
    Rien ne se passe ? Enlève l'étage sed.
    Rien ne se passe ? Enlève l'étage awk.
    Rien ne se passe ? Vérifie que $fichier_temp a un contenu. (par cat $fichier_temp, par exemple).



    Mais ! Un souvenir me revient en mémoire ... C'est la première chose que je t'ai dite il y a 15 jours ! Le message est ici (clique sur ce lien).
    Ton json_reformat NE veut PAS de redirection. Tu régresses au lieu de progresser.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut,
    Alors effectivement j'ai remodifié comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Json reformat<$fichier |awk -F ":" '(NR<11){next;} {$1 = ""; print $0}' >final.json
    Tu avais dis:

    "Parce qu'il attend une entrée que tu ne lui donnes pas. L'entrée devrait être $fichier. Le fait de le mettre en fin de ligne fait que awk reçoit le fichier; et tout ce qui est avant le pipe ne sert à rien (si ce n'est à tout bloquer). Il attend donc sur l'entrée standard, ici, le clavier."

    Mais là c'est bon? Il a bien son entrée ?

    Oui j'ai vérifié le fichier_temp est bien rempli

  6. #6
    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
    Je me casse les pieds à aller chercher le lien et à le poster, tu ne cliques même pas et ne lis même pas.

    Json reformat < $fichier semble être faux.
    Json reformat $fichier semble être juste.
    N'est-ce pas ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Pourtant j'avais bien essayé, et non,
    Json reformat $fichier --> ne marche pas: json_reformat [options]
    Alors que dans d'autres exemples sans awk json reformat<$fichier fonctionne

    Ce qui me fait dire que json reformat<$fichier est ok mais que tout ce qui est à droite du pipe donc après le reformat ne semble pas être exécuté

    C'est d'ailleurs ce que N_Bah semblait aussi valider

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 678
    Par défaut
    j'avais fait une proposition par défaut, en précisant qu'on ne sait pas ce que json_reformat attend en entrée.

    après STFW, le man indique :
    json_reformat [options] < input-file [> output-file]
    il faut donc utiliser une redirection du fichier vers la commande.

    NB : le JSON se traite avec un parser json : jq, jshon, ...
    ou un langage capable de le parser "nativement" : perl, python...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Alors je donne bien le fichier en entré à json reformat mais pourtant le awk ne semble pas exécuté ce qui montre que quelque chose est manquant

    Ce qui est étonnant c'est que initialement tout était fait dans un même bloc: Curl + json reformat + awk + Sed et ça marchait très bien donc c'est vraiment étonnant que ce ne marche plus

  10. #10
    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
    Citation Envoyé par flash026 Voir le message
    J'avais un curl qui fonctionnait de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl url | json reformat |awk -F ":" '{$1 = "" ; print $0}' | sed '1,10d' > sortie.json
    [...]

    Pourtant j'avais bien essayé, et non,
    Json reformat $fichier --> ne marche pas: json_reformat [options]
    Alors que dans d'autres exemples sans awk json reformat<$fichier fonctionne

    [...]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Json reformat<$fichier |awk -F ":" '(NR<11){next;} {$1 = ""; print $0}' >final.json
    [...]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    json reformat<$fichierTemporaire | |awk -F ":" '{$1 = "" ; print $0}' $fichierTemporaire| sed '1,10d' > sortie.json
    Comment se fait-il que le code que tu postes contienne parfois json reformat, parfois Json reformat, parfois json_reformat ?!?

    J'ai beaucoup de mal à croire que le code puisse être à ce point variable.

    Cela veut-il dire que tu copies à la main le code pour le présenter dans ce forum ???

    Si c'est le cas, pourquoi n'utilises-tu pas un bête copier/coller pour nous montrer ton code ?

    Àmha, c'est beaucoup plus commode de corriger du code lorsque c'est effectivement le vrai code !
    Parfois un seul caractère peut faire une grande différence (comme un "<" présent ou absent...)

    Et, c'est quoi, cette espèce de double pipe dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    json reformat<$fichierTemporaire | |awk -F ":" '{$1 = "" ; print $0}' $fichierTemporaire| sed '1,10d' > sortie.json
    ???


    De plus, à moins que j'aie loupé quelque chose, je crois qu'on ne connaît toujours pas le contenu de json_reformat (si c'est la bonne orthographe).

    Pourrais-tu nous poster (avec un copier/coller) le code de cette fonction ou de ce script ?
    On verrait clairement ce qu'il attend en entrée...

  11. #11
    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
    moi, la seule différence que je vois entre ton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl url | json reformat |awk -F ":" '{$1 = "" ; print $0}' | sed '1,10d' > sortie.json
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Json reformat<$fichier |awk -F ":" '(NR<11){next;} {$1 = ""; print $0}' >final.json
    c'est le $fichier qui ne doit pas être défini correctement et d'ailleurs, puisque tu ne l'a pas mis entre guillemet "$fichier" , tu dois être capable de nous dire pourquoi ?

    Autre question: est-ce json reformat ou json_reformat ?

    Car le problème vient peut-être de là: On expose mal son problème ou on donne des exemples foireux et après on s'étonne des réponse à coté de la plaque...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Salut à tous,
    vous avez entièrement raison ce n'est pas clair et ça induit de la confusion.
    En fait je travaille sur un ordi non relié à un internet et je poste sur le forum avec un téléphone. En plus d'apprendre le Bash j'apprends aussi comment travailler (méthodo).

    Donc pour tout remettre au clair:

    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
    36
    37
    38
    39
    40
     
     
    #!/bin/bash
     
    fct_curl(){
            url=$1
            formatage=$2
            echo "$1 - URL : "$url
            echo "$2 - formatage : "$formatage
            fichier=valeursTemp.json
            declare -i retry=0 maxRetry=5;
     
            until curl -o $fichier $url|| 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
                    json_reformat<$fichier| sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g" > valeurs_def.json
            elif [ "$formatage" == "format_2" ]
            then
                    json_reformat<$fichier| sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g"| sed '1d' > valeurs_def.json
            elif [ "$formatage" == "format_3" ]
            then
                    #json_reformat<$fichier|awk -F ":" '{ $3 = "" ; print $4 }' $fichier |sed '1,10d'> valeurs_def.json
                    json_reformat<$fichier | awk -F : '(NR<11){next;} { $3 = "" ; print $4}'> valeurs_def.json
                    echo "param3 (code objet) : "$3
                    echo "param4 (nom script): "$0
     
            fi
            echo "code : " $errCode
            echo "retry : " $retry
            echo "maxRetry : " $maxRetry
            #rm $fichier     
    }
    C'est bien json_reformat

    Si le paramètre format est "format_1" alors le résultat est:
    Nom : 1.PNG
Affichages : 262
Taille : 218,1 Ko
    Ce qui me parait bizarre c'est que malgré les codes erreurs (exemple 56) le curl n'est pas rejoué. De plus on dirait que la valeur reste dans errcode -->il n'y a pas d'erreur dans le dernier url et pourtant errCode a une valeur.


    Pour le format qui me pose problème (format_3), le résultat est:
    Nom : 2.PNG
Affichages : 276
Taille : 12,9 Ko

    et valeurs_def est vide.

    En espérant que ça soit plus clair.

    Bonne journée

  13. #13
    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
    Alors faisons par étape:

    dans ta boucle until, tu fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl -o $fichier $url|| errCode=$? && ((retry < maxRetry))
    Pour toi, que devrait faire cette ligne ?
    Voici une ligne équivalente qui montre comment le bash l'interprète:
    si curl ok:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { echo "commande curl" ; true ;} || echo "error" && echo "compteur"
    si curl ko:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { echo "commande curl" ; false ;} || echo "error" && echo "compteur"
    Est-ce que tu voulais ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Alors selon moi.

    Le curl est exécuté, et si et seulement si il ne fonctionne pas alors on récupére dans la variable errcode le code généré et si le compteur retry est < maxrentry alors on fait ce qui a dans la boucle donc retry+1 et le sleep

    Donc pour rejouer il faudrait ajouter après le retry, un curl?
    Dernière modification par Invité ; 13/08/2021 à 12h30.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 678
    Par défaut
    Donc pour rejouer il faudrait ajouter après le retry, un curl?
    une boucle until exécute la/les commande(s) jusqu'à ce que cette/s commande(s) ai(en)t un code de retour de zéro.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    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
    Dans tous les cas la commande après le && est executé, que le curl soit bon ou pas, et comme ton assertion est vraie (retry < maxretry), tu auras toujours vrai pour until... (voir la remarque de N_BaH).

    Si tu veux conserver le faux de curl tout en executant ce qui est à droit du || , suffit de réécrire comme ceci (mais perso, je trouve ça crade) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    until curl -o $fichier $url|| { errCode=$? && ((maxRetry < retry)) ;}

  17. #17
    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
    Citation Envoyé par flash026 Voir le message
    En fait je travaille sur un ordi non relié à un internet et je poste sur le forum avec un téléphone.
    Tu fais des "curl" sur un ordi non relié à internet ?!?

    C'est un ordi télépathique ?

    Plus sérieusement, c'est quoi, comme ordi ? Et qu'affiche uname -a ?


    Je ne suis pas un spécialiste, mais je crois que dans man curl, il y a des options pour réessayer en cas d'erreur.
    On devrait donc pouvoir simplifier la boucle d'essais avec quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl --retry ${maxRetry:-5} --retry-delay ${delay:-1} -o "$fichier" "$url"
    (au passage, il faut toujours mettre des guillemets autour des variables (sauf si on sait pourquoi))

    Il y a aussi --retry-max-time et --max-time dans le man...


    Ensuite si, au bout de 5 essais, on n'a pas réussi, c'est peut-être pas la peine d'insister...

    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

  18. #18
    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
    Citation Envoyé par disedorgue Voir le message
    Si tu veux conserver le faux de curl tout en executant ce qui est à droit du || , suffit de réécrire comme ceci (mais perso, je trouve ça crade) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    until curl -o $fichier $url|| { errCode=$? && ((maxRetry < retry)) ;}
    Crade ? Je crois que c'était l'une des propositions de N_BaH dans l'autre discussion de flash026 : redirection-bloquante, non ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 678
    Par défaut
    tu n'as pas compris, jack-ft, c'est d'ajouter des accolades que disedorgue trouve crade.


    les accolades ne protègent pas les codes retour, et ne les groupent pas.
    les différents || et autres && sont exécutés dans l'ordre d'apparition, qu'il soient entre accolades ou entre parenthèses.
    il n'y a que la structure if...elif...fi qui peut les séparer/grouper efficacement,.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    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
    Je vois qu'il y en a qui sont pour la paix des ménages

    Je trouve que c'est crade car justement la compréhension du code est quelque peu hésitante et donc illisible.

    Ici, le fait de mettre des accolades fera que le && ne sera exécuté que si on entre dans l'accolade et donc ici, si le || est exécuté.

    Il y a aussi une raison de choisir l'accolade au lieu de la parenthèse: les variables définie dans un bloc de parenthèse n'est visible que dans le dit bloc, ce n'est pas le cas pour les blocs entre accolades.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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