根据其内容选择多个子属性之一

问题描述 投票:0回答:1

我有一个描述 OPNSense 防火墙配置的 JSON 输出。

我想将输出压缩成更有用的东西。考虑 VLAN 列表的以下元素

[
  {
    "key": "0eb660b0-555a-469e-be04-8c3584108f9b",
    "value": {
      "if": {
        "igb1": {
          "value": "igb1 (64:62:66:22:6e:d0) [UNTAGGED]",
          "selected": 0
        },
        "igb2": {
          "value": "igb2 (64:62:66:22:6e:d1) [tagged]",
          "selected": 1
        }
      },
      "tag": "20",
      "pcp": {
        "1": {
          "value": "Background (1, lowest)",
          "selected": 0
        },
        "0": {
          "value": "Best Effort (0, default)",
          "selected": 1
        },
        "2": {
          "value": "Excellent Effort (2)",
          "selected": 0
        }
      },
      "proto": {
        "": {
          "value": "Auto",
          "selected": 1
        },
        "802.1q": {
          "value": "802.1Q",
          "selected": 0
        },
        "802.1ad": {
          "value": "802.1ad",
          "selected": 0
        }
      },
      "descr": "USERS: PCs und Handies  ",
      "vlanif": "vlan0.20"
    }
  }
]

我只想查看具有

if
pcp
proto
selected ==1
的内容。我是否得到他们的钥匙或他们的价值是另一个问题。结果可能如下所示:

[
  {
    "key": "0eb660b0-555a-469e-be04-8c3584108f9b",
    "value": {
      "if": {
        "igb2": {
          "value": "igb2 (64:62:66:22:6e:d1) [tagged]",
          "selected": 1
        }
      },
      "tag": "20",
      "pcp": {
        "0": {
          "value": "Best Effort (0, default)",
          "selected": 1
        }
      },
      "proto": {
        "": {
          "value": "Auto",
          "selected": 1
        }
      },
      "descr": "USERS: PCs und Handies  ",
      "vlanif": "vlan0.20"
    }
  }
]

参见在线

我尝试了我想到的

select
的所有变体。但我不知道如何选择子属性而不是整个对象。

jq
1个回答
0
投票

遍历每个潜在的对象,例如使用

.[].value["if", "pcp", "proto"]
,并通过过滤匹配条件的项目来更新它,在本例中为
.selected == 1

.[].value["if", "pcp", "proto"] |= map_values(select(.selected == 1))
[
  {
    "key": "0eb660b0-555a-469e-be04-8c3584108f9b",
    "value": {
      "if": {
        "igb2": {
          "value": "igb2 (64:62:66:22:6e:d1) [tagged]",
          "selected": 1
        }
      },
      "tag": "20",
      "pcp": {
        "0": {
          "value": "Best Effort (0, default)",
          "selected": 1
        }
      },
      "proto": {
        "": {
          "value": "Auto",
          "selected": 1
        }
      },
      "descr": "USERS: PCs und Handies  ",
      "vlanif": "vlan0.20"
    }
  }
]

演示

© www.soinside.com 2019 - 2024. All rights reserved.