JQ возвращает все массивы, которые соответствуют одному полю - PullRequest
2 голосов
/ 15 марта 2020

Я пытаюсь захватить все массивы, которые соответствуют элементу, но у меня проблемы с возвратом всего.

Данные

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"
  }
}

Мои попытки повсюду. Я не уверен, как назвать верхний уровень и искать элементы на нескольких уровнях. Спасибо

1 Ответ

1 голос
/ 15 марта 2020

Просто укажите 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"
  }
}
...