JQ根据内部项过滤特定项
JQ filter specific item based on inner item
有如下数组
[
[
{ "field" : { "name": "appname" }, "value": { "value" : "app1" } },
{ "field" : { "name": "appstat" }, "value": { "value" : "UP" } }
],
[
{ "field" : { "name": "appname" }, "value": { "value" : "app2" } },
{ "field" : { "name": "appstat" }, "value": { "value" : "DOWN" } }
],
[
{ "field" : { "name": "appname" }, "value": { "value" : "app3" } },
{ "field" : { "name": "appstat" }, "value": { "value" : "READY"} }
]
]
我希望能够 select 基于应用名称的特定项目。
所以我可以做例子
jq.[]app3
响应应该是READY
这应该会带你到那里
jq -r --arg q "app3" '
.[]
| select(.[] | .field.name == "appname" and .value.value == $q)
| .[]
| select(.field.name == "appstat").value.value
'
READY
但是,您的数据结构似乎比较复杂。您最好(至少对于这个用例)使用更简单的对象数组来查找键值对。例如,像这样转换您的输入:
jq 'map(map({(first(.field.name)): first(.value.value)}) | add)'
[
{
"appname": "app1",
"appstat": "UP"
},
{
"appname": "app2",
"appstat": "DOWN"
},
{
"appname": "app3",
"appstat": "READY"
}
]
这样一来,您的查找就会像
一样简单
jq -r --arg q "app3" '.[] | select(.appname == $q).appstat'
READY
有如下数组
[
[
{ "field" : { "name": "appname" }, "value": { "value" : "app1" } },
{ "field" : { "name": "appstat" }, "value": { "value" : "UP" } }
],
[
{ "field" : { "name": "appname" }, "value": { "value" : "app2" } },
{ "field" : { "name": "appstat" }, "value": { "value" : "DOWN" } }
],
[
{ "field" : { "name": "appname" }, "value": { "value" : "app3" } },
{ "field" : { "name": "appstat" }, "value": { "value" : "READY"} }
]
]
我希望能够 select 基于应用名称的特定项目。
所以我可以做例子
jq.[]app3
响应应该是READY
这应该会带你到那里
jq -r --arg q "app3" '
.[]
| select(.[] | .field.name == "appname" and .value.value == $q)
| .[]
| select(.field.name == "appstat").value.value
'
READY
但是,您的数据结构似乎比较复杂。您最好(至少对于这个用例)使用更简单的对象数组来查找键值对。例如,像这样转换您的输入:
jq 'map(map({(first(.field.name)): first(.value.value)}) | add)'
[
{
"appname": "app1",
"appstat": "UP"
},
{
"appname": "app2",
"appstat": "DOWN"
},
{
"appname": "app3",
"appstat": "READY"
}
]
这样一来,您的查找就会像
一样简单jq -r --arg q "app3" '.[] | select(.appname == $q).appstat'
READY