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

Demo


但是,您的数据结构似乎比较复杂。您最好(至少对于这个用例)使用更简单的对象数组来查找键值对。例如,像这样转换您的输入:

jq 'map(map({(first(.field.name)): first(.value.value)}) | add)'
[
  {
    "appname": "app1",
    "appstat": "UP"
  },
  {
    "appname": "app2",
    "appstat": "DOWN"
  },
  {
    "appname": "app3",
    "appstat": "READY"
  }
]

Demo

这样一来,您的查找就会像

一样简单
jq -r --arg q "app3" '.[] | select(.appname == $q).appstat'
READY

Demo