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 :

Question jq sur un json en sortie d'un curl


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2021
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Question jq sur un json en sortie d'un curl
    Bonjour à tous

    J'ai un script dans lequel je fait des curl sur une api mailjet. Afin de récupérer certaines informations.

    Voici mon script:

    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
    #!/bin/bash
     
    ziprep="/home/batches/dev/compobatch/sendmail/"
    zipfile=$ziprep\*.zip
    campagne=$(basename ${zipfile} | cut -d '_' -sf1)
    echo $campagne
     
    #1ère étape: Appel de l'api pour trouver l'id de la campagne
    id=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/campaign?CustomCampaign=$campagne | jq '.Data[0].ID')
    echo "voici: $id"
     
    #2ère étape: Appel de l'api
    variable=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id)
    echo "revoici: $variable"
     
     
    #3ème étape: Générer le fichier csv
    datecsv=$(date +%Y%m%d%H%M%S)
    echo "Status;Date d'envoi" > MAILJET_RETOUR_"$id"_"$datecsv".csv
     
    #nbrmessage=$variable | jq '.Count'
    nbrmessage=$(curl -s -X GET --user "XXXXXXXXX:XXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq '.Count')
    echo "count $nbrmessage"
     
    for ((i=0; i<$nbrmessage; i++))
    do
            statut=$variable | jq '.Data[0].Status'
            echo "message $statut"
     
    done

    Dans mon premier curl, j'arrive bien à afficher ma variable id, et afficher sa valeur. Quand je lance le second curl, il me retourne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { "Count" : 4, "Data" : [{ "ArrivedAt" : "2021-03-03T08:15:15Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 92886742930108178, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972770, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "bc60344f-2b8f-4bf7-8820-118550386009" }, { "ArrivedAt" : "2021-03-03T08:15:11Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 95420017728093675, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972798, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "ae4ab34f-e13d-4dda-960f-b03f9f17156f" }, { "ArrivedAt" : "2021-03-03T08:15:15Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 92042318010622907, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972696, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "97859cb1-93ba-4206-b044-06e6e3ca1168" }, { "ArrivedAt" : "2021-03-03T08:15:10Z", "AttachmentCount" : 0, "AttemptCount" : 0, "CampaignID" : 7654780542, "ContactAlt" : "", "ContactID" : 46955856, "Delay" : 0, "DestinationID" : 13432928, "FilterTime" : 0, "ID" : 95701492698544310, "IsClickTracked" : false, "IsHTMLPartIncluded" : false, "IsOpenTracked" : true, "IsTextPartIncluded" : false, "IsUnsubTracked" : false, "MessageSize" : 972724, "SenderID" : 6453703745, "SpamassassinScore" : 0, "SpamassRules" : "", "StatePermanent" : false, "Status" : "sent", "Subject" : "", "UUID" : "a0125ec6-fdd2-466c-ba5e-eb0945357b81" }], "Total" : 4 }
    Ce qui est normal, jusqu'ci tout va bien.
    Il affiche les infos pour les 4 mails que j'ai envoyés.

    Ensuite, je souhaite afficher avec une boucle, uniquement l'information status, ArrivedAt et l'ID. (je les ai mis en gras dans le résultat juste au dessus).

    Pour cela, je fais un curl à nouveau, et je récupère l'info Count pour avoir le nombre de mails, ici 4 avec mon '"jq '.Count'".

    Puis, je boucle pour afficher le status, ArrivedAt et ID de chaque mails. Mais c'est la que j'ai un petit soucis, quand je fais ceci avec ma boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ((i=0; i<$nbrmessage; i++))
    do
            statut=$variable | jq '.Data[i].Status'
            echo "message $statut"
     
    done
    En sortie de mon script pour la boucle, j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jq: error: i/0 is not defined at <top-level>, line 1:
    .Data[i].Status
    jq: 1 compile error
    message
    Et la, je n'arrive pas du tout à voir comprendre comment récupérer les informations. Donc si quelqu'un à une info, je suis preneur

    Si je ne suis pas très clair dans mes explications, dites-moi.

    Merci beaucoup

    Bonne journée

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    ne poste pas sur un nouveau forum sans avoir fermer tes messages sur les autres forums.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    D'abord, on préférera ne pas harceler le serveur en demandant plusieurs fois la même chose. Utilise un fichier temporaire.

    Ensuite, tu as tout simplement oublié la substitution de commande $( ). Du coup, tu envoies une affectation dans la conduite, ce qui ne veut rien dire.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2021
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Exact, si j'ai 1000 mails, et je boucle 1000 fois mon curl, mon serveur va gueuler un peu.

    Du coup, je supprime ma boucle, et je mets mes curl directement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    statut=$(curl -s -X GET --user "XXXXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq -r '.Data[]|.Status')
            date=$(curl -s -X GET --user "XXXXXXXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq -r '.Data[]|.ArrivedAt')
            idmail=$(curl -s -X GET --user "XXXXXXXXXXXXXXXXX" https://api.mailjet.com/v3/REST/message?Campaign=$id | jq -r '.Data[]|.ID')

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Mais non. Tu utilises un fichier texte. Si cela te file des boutons de créer un fichier dans le dossier courant, le dossier /tmp/ est fait pour cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    curl -s -X GET --user "95d7719608198bde47f11f89d60bbd86:bd8775a08d2c6d7a90480e9a4b729347" "https://api.mailjet.com/v3/REST/message?Campaign=$id" > /tmp/monfichiertemporaire.json
    statut=$(jq -r '.Data[]|.Status' /tmp/monfichiertemporaire.json )
    date=$(jq -r '.Data[]|.ArrivedAt' /tmp/monfichiertemporaire.json )
    idmail=$(jq -r '.Data[]|.ID'  /tmp/monfichiertemporaire.json)
    Note : j'ai bêtement recopié les "jq" de ton dernier message. C'était juste pour montrer que la requête ne se fait qu'une fois. Après, à toi de savoir manipuler un fichier texte avec jq/grep/sed/awk.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2021
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Et pour que les infos dans mon csv, soient bien lignes par lignes, par je dois créer une boucle non ?

    Car la j'ai ça dans mon csv:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Status;Date d'envoi:Identifiant
    sent
    sent
    sent
    sent;2021-03-03T08:15:15Z
    2021-03-03T08:15:11Z
    2021-03-03T08:15:15Z
    2021-03-03T08:15:10Z;92886742930108180
    95420017728093680
    92042318010622910
    95701492698544300
    Car j'aimerais qu'il ressemble à ça, mais je ne vois pas comment faire:

    Status;Date d'envoi:Identifiant
    sent;2021-03-03T08:15:15Z;92886742930108180
    etc

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $  jq -r '.Data | map([.Status ,(.ID |tostring),.Status,.ArrivedAt] | join(", ")) | join("\n")' monfichier.json
    sent, 92886742930108180, sent, 2021-03-03T08:15:15Z
    sent, 95420017728093680, sent, 2021-03-03T08:15:11Z
    sent, 92042318010622910, sent, 2021-03-03T08:15:15Z
    sent, 95701492698544300, sent, 2021-03-03T08:15:10Z
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    je ne comprends pas à quoi sert map() ici.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    À agir sur chaque élément de "Data". Ainsi, on extrait "ID", "Status", etc, pour chaque élément de "Data".

    C'est mieux que de réinventer la roue avec une boucle bash.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ jq -r '.Data[]|[.Status,.ArrivedAt,.ID]|join(";")' monFichier.json
    sent;2021-03-03T08:15:15Z;92886742930108180
    sent;2021-03-03T08:15:11Z;95420017728093680
    sent;2021-03-03T08:15:15Z;92042318010622910
    sent;2021-03-03T08:15:10Z;95701492698544300
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bravo. C'est mieux.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2021
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Je vous remercie beaucoup en tout cas pour votre aide.
    Vous êtes au top

  13. #13
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2021
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Re Bonjour

    Je n'avais pas fait attention, mais dans le csv, je n'ai qu'une seule colonne qui est remplie, c'est à dire que les trois champs vont dans une seule ligne et non un champ par colonne:

    Nom : csv.PNG
Affichages : 150
Taille : 8,3 Ko

    Savez-vous comment je peux diviser pour avoir un champ par colonne ?

    Aussi, j'aimerais rajouter une autre colonne, mais avec un champ que je ne récupère pas via mon "jq", mais via une variable (qui cut sur un nom de fichier). Mais je ne vois pas trop comment le rajouter via cette commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jq -r '.Data | map([.Status ,(.ID |tostring),.ArrivedAt] | join(", ")) | join("\n")' toto.json >> MAILJET_RETOUR_"$id"_"$datecsv".csv

    Merci beaucoup pour votre aide en tout cas

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par bierzo Voir le message
    Re Bonjour

    Je n'avais pas fait attention, mais dans le csv, je n'ai qu'une seule colonne qui est remplie, c'est à dire que les trois champs vont dans une seule ligne et non un champ par colonne:

    Nom : csv.PNG
Affichages : 150
Taille : 8,3 Ko

    Savez-vous comment je peux diviser pour avoir un champ par colonne ?
    Au moment de l'importation dans LibreOffice / Calc, il faut utiliser la virgule comme séparateur.

    Cf.Ouverture et enregistrement de fichiers texte CSV

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    il faut modifier le séparateur.
    soit avec jq selon ce qu'accepte le tableur, soit (lors de l'import) avec le tableur.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2021
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Avec le tableur, quand j'importe les données, et que je choisis la virgule, il me donne ça:

    Nom : csv2.PNG
Affichages : 102
Taille : 7,1 Ko

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    ce n'est pas jq qui rédige les en-têtes de colonnes. Eux, sont encore séparés par des ;
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2021
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Je vais chercher de ce côté la, je vous remercie tous

Discussions similaires

  1. Question simple sur org.json.JSONArray
    Par flamant dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 11/07/2015, 20h13
  2. [LDAP] Questions générales sur LDAP
    Par guiguisi dans le forum Autres SGBD
    Réponses: 5
    Dernier message: 25/05/2005, 10h05
  3. question general sur malloc
    Par vince3320 dans le forum C
    Réponses: 8
    Dernier message: 23/06/2004, 10h39
  4. DTS : Question simple sur sources de données
    Par guignol dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/05/2004, 12h09
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13

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