JQ avec filtre sur multiple noms.

Résolu
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024 - Modifié le 11 oct. 2023 à 17:14
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 16 oct. 2023 à 17:10

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. 

A voir également:

3 réponses

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 12 oct. 2023 à 11:08

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
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
Modifié le 12 oct. 2023 à 11:17

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
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 12 oct. 2023 à 11:26

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
bob737 > mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024
16 oct. 2023 à 10:13

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
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > bob737
16 oct. 2023 à 17:10

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

0
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
12 oct. 2023 à 09:49

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

0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 12 oct. 2023 à 11:13

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