【发布时间】:2021-01-14 11:09:32
【问题描述】:
我有这种类型的数据:
{
"cidr" : "X.X.X.X/27",
"defaultGateway" : "X.X.X.X",
"full" : false,
"id" : "X.X.X.X",
"ipAddressTab" : [
{
"alias_domain" : null,
"alias_name" : null,
"description" : "This is the network address for X.X.X.X/27",
"dnr_rr" : null,
"dns_domain" : null,
"environnement" : null,
"fdqn" : null,
"hostname" : null,
"ip" : "X.X.X.X",
"requester" : null,
"status" : "reserved",
"type" : "network"
},
{
"alias_domain" : null,
"alias_name" : null,
"description" : "This is the default gateway address for X.X.X.X/27",
"dnr_rr" : null,
"dns_domain" : null,
"environnement" : null,
"fdqn" : null,
"hostname" : null,
"ip" : "X.X.X.X",
"requester" : null,
"status" : "reserved",
"type" : "gateway"
},
{
"alias_domain" : "toto.com",
"alias_name" : "",
"description" : "this is a test",
"dns_domain" : "",
"environnement" : "test",
"fdqn" : "XXX",
"hostname" : "XXX",
"ip" : "X.X.X.X",
"requester" : "XXX",
"status" : "allocated",
"type" : "VM"
},
{
"alias_domain" : "toto.com",
"alias_name" : "",
"description" : "this is a test",
"dns_domain" : "",
"environnement" : "test",
"fdqn" : "XXX",
"hostname" : "XXX",
"ip" : "X.X.X.X",
"requester" : "XXX",
"status" : "allocated",
"type" : "VM"
},
{
"ip" : "X.X.X.X",
"status" : "reserved"
},
{
"ip" : "X.X.X.X",
"status" : "reserved"
},
{
"ip" : "X.X.X.X",
"status" : "reserved"
},
{
"ip" : "X.X.X.X",
"status" : "reserved"
},
{
"alias_domain" : null,
"alias_name" : null,
"description" : "This is the broadcast address for X.X.X.X/27",
"dnr_rr" : null,
"dns_domain" : null,
"environnement" : null,
"fdqn" : null,
"hostname" : null,
"ip" : "X.X.X.X",
"requester" : null,
"status" : "reserved",
"type" : "broadcast"
}
]
}
我想提取状态为“保留”的 IP,但不提取网关/网络/广播 IP 的数据:
cat myfile | jq '.ipAddressTab[] | select(.status == "reserved") | select(.type != "network") | select(.type != "gateway") | select(.type != "broadcast")'
输出是:
{
"ip": "X.X.X.X",
"status": "reserved"
}
{
"ip": "X.X.X.X",
"status": "reserved"
}
{
"ip": "X.X.X.X",
"status": "reserved"
}
{
"ip": "X.X.X.X",
"status": "reserved"
}
但是每个“IP 部分”之间的逗号在哪里?
在我的文件中,大括号中的每个部分都用逗号分隔:
{
"ip" : "X.X.X.X",
"status" : "reserved"
}, <=
{
"ip" : "X.X.X.X",
"status" : "reserved"
}, <=
{
"ip" : "X.X.X.X",
"status" : "reserved"
}, <=
{
"ip" : "X.X.X.X",
"status" : "reserved"
}, <=
当我用 jq 解析我的文件时,有办法保留它们吗?
谢谢!
【问题讨论】:
-
没有逗号,因为你得到了 4 个对象。将命令更改为
jq '[.ipAddressTab[] | select(.status == "reserved") | select(.type != "network") | select(.type != "gateway") | select(.type != "broadcast")]' myfile就可以了,但你会得到一个数组