我有这个json,我想获取适合变量子网的相应子网的ID。

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

由于jq不支持正则表达式。我发现获得正确ID的唯一方法是像这样混合grep,sed和jq:
tabNum=$((`echo ${json} | jq ".subnets[].cidr" | grep -n "$subnet" | sed "s/^\([0-9]\+\):.*$/\1/"` - 1))
NET_ID=`echo ${json} | jq -r ".subnets[${tabNum}].id"`

有没有办法只使用jq获得id?

最佳答案

对我来说,您提供的脚本的功能尚不完全清楚,但似乎只查找包含提供的子集的字符串。我建议使用 contains startswith 。示例脚本如下所示:

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

由于您提到过regex:jq的最新版本1.5包含regex支持(感谢Jeff Mercado指出了这一点!),并且,如果您不得不经常处理字符串操作问题,我建议您进行检查。

10-07 19:28
查看更多