如何在 json 中使用 json 查询以同名键开始查询?

How to query in json start with same name key using json query?

我有以下 json 我想取出一个 jason 数组中的所有 macaddress 列表,我该怎么做?

{
  "facts_hash": {
    "lib": "/usr/share/fdi/facts:/opt/extension/facts",
    "interfaces": "eno1,eno2,eno3,eno4,eno5,eno6,ens3f0,ens3f1,lo",
    "ipaddress_eno1": "192.168.101.135",
    "macaddress_eno1": "08:f1:ea:6d:03:3c",
    "netmask_eno1": "255.255.255.0",
    "mtu_eno1": "1500",
    "macaddress_eno2": "08:f1:ea:6d:03:3d",
    "mtu_eno2": "1500",
    "macaddress_eno3": "08:f1:ea:6d:03:3e",
    "mtu_eno3": "1500",
    "macaddress_eno4": "08:f1:ea:6d:03:3f",
    "mtu_eno4": "1500",
    "macaddress_eno5": "b8:83:03:81:4b:20",
    "mtu_eno5": "1500",
    "macaddress_eno6": "b8:83:03:81:4b:21",
    "mtu_eno6": "1500",
    "macaddress_ens3f0": "b8:83:03:84:d5:1c",
    "mtu_ens3f0": "1500",
    "macaddress_ens3f1": "b8:83:03:84:d5:1d",

  },
  "name": "daisy-joni-selitto-quinto",
  "id": 269
}

如果可以用jq,这个表达式

 [.facts_hash[]|  to_entries[] | select(.key|startswith("mac")).value]

应该输出这个数组:

[
  "08:f1:ea:6d:03:3c",
  "b8:83:03:81:4b:21",
  "b8:83:03:84:d5:1c",
  "b8:83:03:84:d5:1d"
]

另一种选择是将 json 转换为 xml 并在其上使用 xpath。

您可以使用 Object.keys 迭代对象中的键,startsWith 检查 macadress 文本并使用 reduce 将您的要求输出为

var result = Object.keys(obj.facts_hash).reduce((acc, item)=>{
  if(item.startsWith("macaddress")) console.log(obj.facts_hash[item]);
}, []);

  var result = Object.keys(obj.facts_hash).reduce((acc, item) => {
                if (item.startsWith("macaddress")) {
                    //console.log(obj.facts_hash[item]);
                    acc.push(obj.facts_hash[item]);
                }
                return acc;
            }, []);
  console.log(result);

var obj = {
  "facts_hash": {
    "lib": "/usr/share/fdi/facts:/opt/extension/facts",
    "interfaces": "eno1,eno2,eno3,eno4,eno5,eno6,ens3f0,ens3f1,lo",
    "ipaddress_eno1": "192.168.101.135",
    "macaddress_eno1": "08:f1:ea:6d:03:3c",
    "netmask_eno1": "255.255.255.0",
    "mtu_eno1": "1500",
    "macaddress_eno2": "08:f1:ea:6d:03:3d",
    "mtu_eno2": "1500",
    "macaddress_eno3": "08:f1:ea:6d:03:3e",
    "mtu_eno3": "1500",
    "macaddress_eno4": "08:f1:ea:6d:03:3f",
    "mtu_eno4": "1500",
    "macaddress_eno5": "b8:83:03:81:4b:20",
    "mtu_eno5": "1500",
    "macaddress_eno6": "b8:83:03:81:4b:21",
    "mtu_eno6": "1500",
    "macaddress_ens3f0": "b8:83:03:84:d5:1c",
    "mtu_ens3f0": "1500",
    "macaddress_ens3f1": "b8:83:03:84:d5:1d",

  },
  "name": "daisy-joni-selitto-quinto",
  "id": 269
}


var result = Object.keys(obj.facts_hash).reduce((acc, item)=>{
  if(item.startsWith("macaddress")) console.log(obj.facts_hash[item]);
}, []);

//console.log(result);

jq 按照 jack 的建议进行操作..这里是清晰的 jq 表达式..

jq'[.facts_hash | to_entries[] | select(.key|startswith("macaddress_")).value]'

再次感谢杰克的帮助..