【问题标题】:jq: Unable to retrieve a key/value from Json file using jqjq:无法使用 jq 从 Json 文件中检索键/值
【发布时间】:2021-07-02 21:31:11
【问题描述】:

我有以下来自 curl 输出的 JSON,我需要从中检索 IP 地址。我尝试了以下 jq 查询,但出现以下错误。我尝试了其他几种方法,但没有运气

curl -sH "X-Requested-By: ambari" -u admin:admin -i http://${AMBARI_IP}:8080/api/v1/hosts?fields=Hosts/host_name,Hosts/ip | jq '.[] | {.items.Hosts.ip}'

jq: error: syntax error, unexpected FIELD (Unix shell quoting issues?) at <top-level>, line 1:
.[] | {.items.Hosts.ip}
jq: 1 compile error
(23) Failed writing body

下面是 curl 的输出

HTTP/1.1 200 OK
Date: Fri, 02 Jul 2021 21:04:27 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Cache-Control: no-store
Pragma: no-cache
Set-Cookie: AMBARISESSIONID=123344.node0;Path=/;HttpOnly
Expires: Thu, 01 Jan 1970 00:00:00 GMT
User: admin
Content-Type: text/plain;charset=utf-8
X-Content-Type-Options: nosniff
Vary: Accept-Encoding, User-Agent
Transfer-Encoding: chunked
{
  "href" : "http://10.0.0.33:8080/api/v1/hosts?fields=Hosts/host_name,Hosts/ip",
  "items" : [
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/sil.dev.test.com",
      "Hosts" : {
        "host_name" : "test123.sil.dev.test.com",
        "ip" : "10.135.3.119"
      }
    },
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/test001.sil.dev.test.com",
      "Hosts" : {
        "cluster_name" : "test_cluster",
        "host_name" : "test001.sil.dev.test.com",
        "ip" : "10.0.0.33"
      }
    },
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/test002.sil.dev.test.com",
      "Hosts" : {
        "cluster_name" : "test_cluster",
        "host_name" : "test002.sil.dev.test.com",
        "ip" : "10.0.0.34"
      }
    },
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/test003.sil.dev.test.com",
      "Hosts" : {
        "cluster_name" : "test_cluster",
        "host_name" : "test003.sil.dev.test.com",
        "ip" : "10.0.0.35"
      }
    },
}

【问题讨论】:

  • .[] | 的预期用途是什么?如果您要返回列表,那将是有道理的;当顶级项目是一个对象时,就没有那么多了。
  • @CharlesDuffy:.[] 可用于任何复合实体。等等!
  • ,@peak,当然可以,但我不确定在这种情况下它是否明智;在迭代对象的情况下,您正在丢弃数据(我忘记了它是否迭代键或值,并且不太倾向于查找它 - 恕我直言,不一起处理键和值基本上是不正确的一对)。

标签: json bash shell curl jq


【解决方案1】:

试试jq '.items[].Hosts.ip'。这会从外部对象中获取 .items 键,迭代 items 数组,然后从每个对象的路径 .Hosts.ip 中提取值。

PS > cat a.json
{
  "href" : "http://10.0.0.33:8080/api/v1/hosts?fields=Hosts/host_name,Hosts/ip",
  "items" : [
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/sil.dev.test.com",
      "Hosts" : {
        "host_name" : "test123.sil.dev.test.com",
        "ip" : "10.135.3.119"
      }
    },
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/test001.sil.dev.test.com",
      "Hosts" : {
        "cluster_name" : "test_cluster",
        "host_name" : "test001.sil.dev.test.com",
        "ip" : "10.0.0.33"
      }
    },
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/test002.sil.dev.test.com",
      "Hosts" : {
        "cluster_name" : "test_cluster",
        "host_name" : "test002.sil.dev.test.com",
        "ip" : "10.0.0.34"
      }
    },
    {
      "href" : "http://10.0.0.33:8080/api/v1/hosts/test003.sil.dev.test.com",
      "Hosts" : {
        "cluster_name" : "test_cluster",
        "host_name" : "test003.sil.dev.test.com",
        "ip" : "10.0.0.35"
      }
    }
  ]
}
PS > cat a.json | jq '.items[].Hosts.ip'
"10.135.3.119"
"10.0.0.33"
"10.0.0.34"
"10.0.0.35"
PS > cat a.json | jq -r '.items[].Hosts.ip'
10.135.3.119
10.0.0.33
10.0.0.34
10.0.0.35

【讨论】:

  • 感谢您的快速回复。当我执行以下操作时,我收到以下错误parse error: Invalid numeric literal at line 1, column 9。我尝试的所有 jq 都面临同样的问题。 curl -sH "X-Requested-By: ambari" -u admin:admin -i http://${AMBARI_IP}:8080/api/v1/hosts?fields=Hosts/host_name,Hosts/ip | jq '.items | .[] | .Hosts.ip'
  • 你的 curl 调用对我来说失败了,因为我没有 ${AMBARI_IP},所以请编辑你的帖子以在 curl 调用完成后显示你正在使用的确切 JSON。没有必要一步完成。您可以通过分隔命令来简化问题。逐字发布您的文字很重要,否则回答者必须做出可能不适用于您的案例的假设,并且随之而来的是混乱。
  • @Eva curl-i 选项告诉它在输出中包含 HTTP 标头(HTTP/1.1 200 OKDate: .. 的东西)。这不是有效的 JSON,因此 jq 在尝试解析它时会出错。您需要删除 -i 选项,或者在将输出传递给 jq 之前仅拆分输出的 JSON 部分。
  • @GordonDavisson 谢谢,我错过了那个标志的重要性。这是你在 2014 年的解释:stackoverflow.com/a/24566979/6243352
  • @GordonDavisson 是的,-i 在我的情况下是外壳问题。
猜你喜欢
  • 2019-04-14
  • 1970-01-01
  • 2018-11-27
  • 2022-11-29
  • 2017-02-09
  • 1970-01-01
  • 2022-11-10
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多