JQ avec filtre sur multiple noms.

Résolu
bob737 Messages postés 157 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

J'ai une entrée avec plusieurs noms de base. 

DBNAME="db1,db2"

Je voudrais éviter de faire un boucle sur chaque base pour récupérer les infos.

Ma requête ressemble à : 

requete curl | jq -r '.data[]? | "\(.instanceName) \(select (.name==" '$DBNAME' ") |  "\(.name)")'

Ça fonctionne avec une base, mais évidemment, ça plante avec plusieurs bases comme avec l'exemple ci-dessus.

J'ai vu que j'obtiens ce que je veux en faisant :

requete curl | jq -r '.data[]? | "\(.instanceName) \(select (.name=="db1", .name=="db2") |  "\(.name)")'

Du coup, j'ai deux questions :

1) Comment transformer :

db1,db2

en :

.name=="db1", .name=="db2"

2) Une simplification de l'expression jq ci-dessus? 

Merci de votre aide. 

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     

    Bonjour,

    1) Tu peux faire une substitution avec sed :

    #!/bin/bash
    
    DBNAME="aa,bbb,cccc"
    x=$( \
        echo $DBNAME \
        | sed -e 's/,/", .name=="/g' \
        | sed -e 's/^/.name=="/' \
        | sed -e 's/$/"/' \
    )
    echo $x

    Avec ces instructions, la variable x est obtenue à partir de $DB_NAME en effectuant les replacements suivants :

    • les virgules par ", .name=="
    • le début de chaîne (^) par  ".name=="
    • la fin de chaîne ($) par "

    2) Je ne connais pas assez jq pour te dire si on peut mieux faire, mais en tout cas, ça ne me choque pas.

    Bonne chance

    1
  2. bob737 Messages postés 157 Statut Membre
     

    Merci! :-)  mais j'ai mal formulé ma question. Je peux également avoir plus de deux occurrences. 

    DBNAME="db1,db2,db3,..."

    EDIT: J'y suis presque avec le sed ci-dessous (g dans le premier sed). 

    mais :

    jq -r '.data[]? | "\(.instanceName) \(select (.name=="model", .name=="msdb")

    => OK

    alors que :

    jq -r '.data[]? | "\(.instanceName) \(select ('$x')

    => KO avec 

    x=.name=="model", .name=="msdb"

    Je dois avoir un problème d'interprétation de la variable x dans mon expression. 

    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       

      Bonjour,

      • Oui pardon, il manquait effectivement un "g" ligne 6 que j'ai rajouté depuis. Il signifie que la substitution doit être fait autant que fois que possible (pas juste sur la première occurrence).
      • Veille dans tes prochains messages à mettre en forme tes extraits de code, comme expliqué ici.
      • Pour ton erreur, il y a effectivement des problèmes car certains backslash me paraissent bizarres (mais n'utilisant pas jq, à ce stade, je ne peux pas te dire). Quelle serait la chaîne que tu veux obtenir une fois $x substitué ? L'idéal aussi serait que tu partages un json minimal avec la valeur de DBNAME adéquate et le résultat attendu.
      1
      1. bob737 > mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention  
         

        Merci.   je ne peux pas me permettre de consommer plus temps sur ce sujet. 

        ça fonctionne très bien avec x=`echo ...` donc pour le moment, ça me fera ma v1. 

        Merci pour votre aide. :-)

        0
      2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944 > bob737
         

        Oui comme dit dans #5, c'est à peu près la même chose.

        0
  3. bob737 Messages postés 157 Statut Membre
     

    Quelle diff entre x=$(echo ) et x=`echo ... `  ??   car ça fonctionne dans le second cas. 

    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       

      Les deux syntaxes ont le même sens.

      • L'opérateur $( ... ) est spécifique à bash (le shell généralement utilisé)
      • L'opérateur `...` est commun à tous les bash.

      Bien qu'il soit moins générique, j'ai tendance à utiliser $(...) sur le forum car par le passé les `...` étaient mal mises en forme (et parfois les gens ne voient pas la différence entre une apostrophe et une backquote.

      0