JQ avec filtre sur multiple noms.
RésoluBonjour,
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.
- JQ avec filtre sur multiple noms.
- Photo filtre 7 gratuit - Télécharger - Retouche d'image
- Les noms des animaux - Télécharger - Études & Formations
- Filtre whatsapp - Accueil - Messagerie instantanée
- Ecran multiple pc - Guide
- Excel cellule choix multiple - Guide
3 réponses
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
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.
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.
Quelle diff entre x=$(echo ) et x=`echo ... ` ?? car ça fonctionne dans le second cas.
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.