web-dev-qa-db-fra.com

recherche de type regex dans un json avec jq

J'ai ce json et je veux obtenir l'id du sous-réseau correspondant qui correspond au sous-réseau variable.

subnet="192.168.112"
json='{
  "subnets": [
    {
      "cidr": "192.168.112.0/24",
      "id": "123"
    },
    {
      "cidr": "10.120.47.0/24",
      "id": "456"
    }
  ]
}'

Depuis regex n'est pas pris en charge avec jq. Le seul moyen que j'ai trouvé pour obtenir le bon identifiant est de mélanger grep, sed et jq comme ceci:

tabNum=$((`echo ${json} | jq ".subnets[].cidr" | grep -n "$subnet" | sed "s/^\([0-9]\+\):.*$/\1/"` - 1))
NET_ID=`echo ${json} | jq -r ".subnets[${tabNum}].id"`

Existe-t-il un moyen d'obtenir l'ID uniquement en utilisant jq?

17
mguerin

Pour moi, ce que fait votre script fourni n'est pas complètement clair, mais il semble qu'il ne recherche qu'une chaîne contenant le sous-ensemble fourni. Je suggère d'utiliser contains ou startswith . Un exemple de script ressemblerait à ceci:

echo "${json}" | jq --arg subnet "$subnet" '.subnets[] | select(.cidr | startswith($subnet)).id'

Puisque vous mentionnez regex: la dernière version de jq, 1.5, inclut la prise en charge de regex (merci à Jeff Mercado de l'avoir signalé!) Et, si vous devez traiter fréquemment des problèmes de manipulation de chaînes, je vous recommande de le vérifier.

29
user3899165