Удалить несколько объектов, соответствующих условию - PullRequest
0 голосов
/ 13 марта 2019

У меня есть этот JSON-файл:

{
    "uuid": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
    "mp_router_id": "bbbf9a22-5fde-48e2-980f-a6c58d7f941a",
    "config_session_state": "Down",
    "routing_status": "Up",
    "routing_state_flag": 0,
    "vrf_id": 4,
    "routing_state": [],
    "type": "TLR-SR",
    "ports": [{
            "uuid": "cc4e8e98-0a22-4534-aa8c-c30c14b5c3a7",
            "urpf-mode": "NONE",
            "ifuid": 284,
            "mac": "02:50:56:56:44:01",
            "lrouter": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
            "admin_up": true,
            "ips": [
                "127.0.0.1/8"
            ],
            "op_state_up": true,
            "owner": "system",
            "type": "loopback",
            "name": "system-loopback-port"
        },
        {
            "uuid": "ee55ef38-941d-5f2e-8ead-c8bf6b1df06d",
            "lrouter": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
            "ifuid": 281,
            "admin_up": true,
            "ips": [],
            "op_state_up": true,
            "type": "cpu-port",
            "name": ""
        },
        {
            "uuid": "8fd5f7a5-5906-40b7-b8c4-877882896ca8",
            "urpf-mode": "NONE",
            "ifuid": 285,
            "mac": "02:50:56:56:53:00",
            "lrouter": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
            "admin_up": false,
            "ips": [
                "169.254.0.2/28"
            ],
            "op_state_up": false,
            "type": "backplane",
            "name": "bp-sr0-port"
        },
        {
            "uuid": "65f526d1-621c-4f5b-a7e6-7d06278e0226",
            "urpf-mode": "NONE",
            "ifuid": 283,
            "mac": "02:50:56:56:44:55",
            "lrouter": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
            "admin_up": false,
            "ips": [
                "100.64.208.1/31"
            ],
            "op_state_up": false,
            "type": "uplink",
            "name": "LinkedPort_t0-uplink"
        },
        {
            "uuid": "36ccfb0d-45ad-5242-9e0f-2898de2c82db",
            "lrouter": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
            "ifuid": 282,
            "admin_up": false,
            "ips": [],
            "op_state_up": false,
            "type": "blackhole",
            "name": ""
        }
    ],
    "vdr_id": 16,
    "name": "SR-t1"
}

Вывод, который мне нужен:

{
            "uuid": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
            "type": "TLR-SR",
            "ports": [
                {
                    "uuid": "8fd5f7a5-5906-40b7-b8c4-877882896ca8",
                    "admin_up": false,
                    "ips": [
                        "169.254.0.2/28"
                    ],
                    "op_state_up": false,
                    "type": "backplane",
                    "name": "bp-sr0-port"
                },
                {
                    "uuid": "65f526d1-621c-4f5b-a7e6-7d06278e0226",
                    "admin_up": false,
                    "ips": [
                        "100.64.208.1/31"
                    ],
                    "op_state_up": false,
                    "type": "uplink",
                    "name": "LinkedPort_t0-uplink"
                },
            ],
            name": "SR-t1"
        }

Я не хочу показывать элементы с нижеуказанными типами. Если .ports[].type == "blackhole" или "cpu-port" или "loopback"

Я могу получить все в массиве портов и не могу найти способ исключить элементы, которые я хочу исключить. Это возможно с JQ или я упускаю что-то очень фундаментальное?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

или jtc:

bash $ <file.json jtc -x'[ports][type]:' -y'<cpu-port>:[-1]' -y'<blackhole>:[-1]' -y'<loopback>:[-1]' -p
{
   "config_session_state": "Down",
   "mp_router_id": "bbbf9a22-5fde-48e2-980f-a6c58d7f941a",
   "name": "SR-t1",
   "ports": [
      {
         "admin_up": false,
         "ifuid": 285,
         "ips": [
            "169.254.0.2/28"
         ],
         "lrouter": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
         "mac": "02:50:56:56:53:00",
         "name": "bp-sr0-port",
         "op_state_up": false,
         "type": "backplane",
         "urpf-mode": "NONE",
         "uuid": "8fd5f7a5-5906-40b7-b8c4-877882896ca8"
      },
      {
         "admin_up": false,
         "ifuid": 283,
         "ips": [
            "100.64.208.1/31"
         ],
         "lrouter": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
         "mac": "02:50:56:56:44:55",
         "name": "LinkedPort_t0-uplink",
         "op_state_up": false,
         "type": "uplink",
         "urpf-mode": "NONE",
         "uuid": "65f526d1-621c-4f5b-a7e6-7d06278e0226"
      }
   ],
   "routing_state": [],
   "routing_state_flag": 0,
   "routing_status": "Up",
   "type": "TLR-SR",
   "uuid": "ce651ed3-78b9-49a0-9d00-9bfaf33bb12c",
   "vdr_id": 16,
   "vrf_id": 4
}
bash $ 
0 голосов
/ 13 марта 2019

Чтобы исключить ненужные порты, вы можете найти одну из этих эквивалентных альтернатив, в которых используется map(select(...)) идиома интуитивно понятная:

.ports |= map( if (.type | . == "blackhole" or . == "cpu-port" or . == "loopback") then empty else . end)

.ports |= map( if .type | IN("blackhole", "cpu-port", "loopback") then empty else . end)

.ports |= map( select( .type | IN("blackhole", "cpu-port", "loopback") | not ) )

Чтобы выбрать интересующие пары ключ-значение, выможно использовать сокращение {foo, bar} для {"foo":.foo, "bar":.bar}

...