json - 删除多个符合条件的对象
问题描述
我有这个 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 可以做到这一点,还是我错过了一些非常基本的东西?
解决方案
要消除您不想要的端口,您可能会找到使用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}
推荐阅读
- node.js - NodeJS 性能问题 - 单线程
- python - 识别具有相似地址的 ID
- javascript - 我什么时候应该在我的 react 应用程序中使用 Redux?
- protractor - 如何在量角器黄瓜中执行软断言
- flutter - 如何从颤振中的时间戳值中仅获取日期和时间值
- amazon-web-services - 有没有办法将多个请求/触发表单 SQS 连接到单线程 lambda 函数?
- r - 如何更改 ggforest(或 coxph 回归图)中的绘图大小?
- c++ - 使用&符号后跟下划线命名的变量是什么意思?
- python - 如何写入文本文件python 3?
- angular - Ag 网格图标标题