使用jq从JSON输出中提取特定字段

使用jq从JSON输出中提取特定字段,json,jq,Json,Jq,我有一个JSON输出,如下所示: { "example": { "sub-example": [ { "name": "123-345", "tag" : 100 }, { "name": "234-456", "tag" : 100 }, { "name": "4a7-a07a5", "tag" : 100 }

我有一个JSON输出,如下所示:

{
  "example": {
    "sub-example": [
      {
        "name": "123-345",
        "tag" : 100
      },
      {
        "name": "234-456",
        "tag" : 100
      },
      {
        "name": "4a7-a07a5",
        "tag" : 100
      }
    ]
  }
}
我想提取三个“name”字段的值,并将其存储在三个变量中

我尝试了
cat-json_文件| jq.[“example.sub-example.name”]
来提取“name”字段的值,但这不起作用


有谁能告诉我如何使用jq(或其他方法)实现这一点吗?

如果您只想提取
name
字段,您要查找的命令是
jq.example.“sub-example”|.]|.name'
。如果要将名称保留在数组中,请将整个
jq
表达式括在方括号中。

在jq 1.3中,可以使用过滤器提取值:

.example["sub-example"] | .[] | .name
或者更紧凑地说:

.example["sub-example"][].name
这些当然也适用于jq的更高版本

读入shell变量 <>而不是填充单独的shell变量(需要预先知道有多少个值),考虑填充一个shell数组。例如,将bash shell与
mapfile
(又称
readarray
)一起使用:


mapfile-tary<已经有几年了,我最近不得不自己做这件事,所以我想我应该在这里发布另一种方式

您还可以使用
map()
提取特定字段。e、 g

.example."sub-example"|map(.name)

参考:

谢谢您的建议。但是,当我进行cat测试时,例如“sub-example”|.]|.name“我得到错误:错误:语法错误,意外的QQSTRING_开始,预期为IDENT.example。“sub-example”|.[]|.name ^1编译错误(以“^指向jq”后面的点。示例)您使用的是
jq
的最新版本吗?它在我的系统上运行得很好。我使用的是1.5版(您可以使用
jq--version
),它是1.3版(我是通过apt-get-install-jq下载的)。是否有其他方法获得最新版本?我使用的是Ubuntu 14.04服务器。如果我有一些字段“实例名称”而不是“名称”,那么命令jq.example.“sub-example”|.[]|.实例名称”不起作用。你有没有修复它的建议?那是因为它将
.name-of-instance
解释为一个表达式(
.name-of-instance
)。使用引号,就像我在
“子示例”
中所做的那样。
.example."sub-example"|map(.name)