首页 > 解决方案 > 删除多个符合条件的对象

问题描述

我有这个 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 可以做到这一点,还是我错过了一些非常基本的东西?

标签: jsonjq

解决方案


要消除您不想要的端口,您可能会找到使用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}


推荐阅读