M.R*_*dha 2 select json where-clause jq
我是 jq 的新手,我尝试使用它根据位于 json 结构深处的键来搜索 json 文件中的值。这是我的 json 文件的示例:
{
"data": {
"inventory": {
"location": "remote",
"list": {
"content": [
{
"item": {
"name": "minivan"
},
"owner": {
"id": "12345",
"state": "CA"
}
},
{
"item": {
"name": "sedan"
},
"owner": {
"id": "67890",
"state": "AZ"
}
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试做的搜索示例是:
select item.name where owner.id = "67890"
Run Code Online (Sandbox Code Playgroud)
预期输出为:
item.name = "sedan"
Run Code Online (Sandbox Code Playgroud)
我正在尝试运行以下命令:
jq '.[] | select .owner.id = "67890" | .item.name' json
Run Code Online (Sandbox Code Playgroud)
它会产生一个错误:
jq: error: select/0 is not defined at <top-level>, line 1:
.[] | select .owner.id = "67890" | .item.name
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)
任何有关如何在 jq 中执行此操作的指示将不胜感激!谢谢!
首先,您必须“导航”到要进行查询的位置。这似乎是一个数组。
.data.inventory.list.content
Run Code Online (Sandbox Code Playgroud)
.data.inventory.list.content
Run Code Online (Sandbox Code Playgroud)
接下来,让我们迭代该数组的项目,这为我们提供了一个对象流。
.[]
Run Code Online (Sandbox Code Playgroud)
[
{
"item": {
"name": "minivan"
},
"owner": {
"id": "12345",
"state": "CA"
}
},
{
"item": {
"name": "sedan"
},
"owner": {
"id": "67890",
"state": "AZ"
}
}
]
Run Code Online (Sandbox Code Playgroud)
我们从这些对象中选择符合您标准的对象。
select(.owner.id == "67890")
Run Code Online (Sandbox Code Playgroud)
.[]
Run Code Online (Sandbox Code Playgroud)
最后,我们提取您感兴趣的值。
.item.name
Run Code Online (Sandbox Code Playgroud)
"sedan"
Run Code Online (Sandbox Code Playgroud)
jq 调用中的所有内容组合如下:
{
"item": {
"name": "minivan"
},
"owner": {
"id": "12345",
"state": "CA"
}
}
{
"item": {
"name": "sedan"
},
"owner": {
"id": "67890",
"state": "AZ"
}
}
Run Code Online (Sandbox Code Playgroud)
"sedan"
Run Code Online (Sandbox Code Playgroud)
此输出仍然是有效的 JSON 文档(只包含 JSON 字符串)。如果要将输出处理为原始文本,请使用--raw-output(或-r) 选项:
select(.owner.id == "67890")
Run Code Online (Sandbox Code Playgroud)
sedan
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8623 次 |
| 最近记录: |