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

130

我有一个以下的 JSON 输出:

{
  "example": {
    "sub-example": [
      {
        "name": "123-345",
        "tag" : 100
      },
      {
        "name": "234-456",
        "tag" : 100
      },
      {
        "name": "4a7-a07a5",
        "tag" : 100
      }
    ]
  }
}

我想提取三个“name”字段的值并将其存储在三个变量中。

我尝试使用cat json_file | jq'.["example.sub-example.name"]'来提取“name”字段的值,但这不起作用。

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

3个回答

145
如果你只想提取name字段,你需要使用命令jq '.example."sub-example" | .[] | .name'。如果你想将这些名称保存在数组中,请用方括号括起整个jq表达式。

谢谢您的建议。然而,当我执行cat test | jq '.example."sub-example" | .[] | .name'时,我遇到了错误:error: syntax error, unexpected QQSTRING_START, expecting IDENT .example."sub-example" | .[] | .name ^ 1 compile error (其中^指向jq '.example后面的点)。 - rmb
你是否在使用最新版本的 jq?在我的系统上它运行得非常好。我正在使用1.5版本(你可以通过 jq --version 命令进行检查)。 - aaaaaa123456789
这是1.3版本(我通过apt-get install jq下载的)。有没有其他方法获取最新版本?我正在使用Ubuntu 14.04服务器。 - rmb
这是因为它将.name-of-instance解释为一个表达式(.name - of - instance)。像我在"sub-example"中使用引号。 - aaaaaa123456789
你如何同时提取两个字段? - Petrus Theron
显示剩余2条评论

47
使用 jq 1.3 (及更高版本),您可以使用过滤器来提取值:
.example["sub-example"] | .[] | .name

更简洁地说:
.example["sub-example"][].name

当然,这些方法也适用于后续版本的jq。

读取shell变量

与其填充单独的shell变量(这需要事先知道有多少个值),不如考虑填充一个shell数组。例如,使用bash shell和mapfile(又名readarray):

mapfile -t ary < <(< json_file jq '.example."sub-example"[].name')

您可以使用shell的while循环代替。等等等等。关于这个主题,有许多SO Qs。

7

已经过了几年,我最近自己不得不这样做,所以想在这里再发布另一种方法。

你还可以使用 map() 来提取特定的字段。例如:

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

Ref: https://jqplay.org/s/N6TboUkELM


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接