首页 > 解决方案 > jq 返回匹配一个字段的所有数组

问题描述

我正在尝试获取与元素匹配的所有数组,但无法返回所有内容。

数据

cat testerr.json | jq .''

{
  "circuitIdNum": 1226,
  "description": "9287-customer:vpn-2001226-(R1-Loopback0)",
  "interfaceId": "1040",
  "ipv4": {
    "aclEgress": "rot-out",
    "addr": "55.44.53.191/31",
    "bgpNeighbor": "33.567.53.190"
  },
  "loadInterval": 30,
  "remoteRouter": "R1-Loopback0",
  "shortName": "rot",
  "tunnel": {
    "destination": "94.252.78.14",
    "source": "66.52.5.4"
  }
}
{
  "circuitIdNum": 1227,
  "description": "9287-customer:vpn-2001227-(R2-Loopback0)",
  "interfaceId": "1041",
  "ipv4": {
    "aclEgress": "rot-out",
    "addr": "23.77.175.253/31",
    "bgpNeighbor": "21.44.175.252"
  },
  "loadInterval": 30,
  "remoteRouter": "R2-Loopback0",
  "shortName": "rot",
  "tunnel": {
    "destination": "22.22.18.15",
    "source": "1.5.55.5"
  }
}

这种工作,但只提供目的地和来源。

cat testerr.json | jq .'tunnel | select(.source | contains ("1.5.55."))'

{
  "destination": "22.22.18.15",
  "source": "1.5.55.5"
}

而不是只回复隧道部分,我希望它返回完整的数组。

{
  "circuitIdNum": 1227,
  "description": "9287-customer:vpn-2001227-(R2-Loopback0)",
  "interfaceId": "1041",
  "ipv4": {
    "aclEgress": "rot-out",
    "addr": "23.77.175.253/31",
    "bgpNeighbor": "21.44.175.252"
  },
  "loadInterval": 30,
  "remoteRouter": "R2-Loopback0",
  "shortName": "rot",
  "tunnel": {
    "destination": "22.22.18.15",
    "source": "1.5.55.5"
  }
}

我的尝试无处不在。我不知道如何调用顶层和搜索元素的几个级别。谢谢

标签: jsonselectjq

解决方案


只需让您select()引用嵌套字段,这将返回整个顶级元素。

$ cat testerr.json | jq 'select(.tunnel.source | contains ("1.5.55."))'
{
  "circuitIdNum": 1227,
  "description": "9287-customer:vpn-2001227-(R2-Loopback0)",
  "interfaceId": "1041",
  "ipv4": {
    "aclEgress": "rot-out",
    "addr": "23.77.175.253/31",
    "bgpNeighbor": "21.44.175.252"
  },
  "loadInterval": 30,
  "remoteRouter": "R2-Loopback0",
  "shortName": "rot",
  "tunnel": {
    "destination": "22.22.18.15",
    "source": "1.5.55.5"
  }
}

推荐阅读