JQ无法解析所需的输出,无法使用字符串

时间:2017-01-16 16:51:15

标签: arrays json bash curl jq

我的json看起来像。

{
  "cgi_json_version": "1.8.0",

  "status": {

    "hostgroup_summary": [

      { "hostgroup_name": "ESXI",
        "hosts_up": 9, "hosts_down": 0,
        "hosts_down_unacknowledged": 0, "hosts_down_scheduled": 0,
        "hosts_down_acknowledged": 0, "hosts_down_disabled": 0,
        "hosts_unreachable": 0, "hosts_unreachable_unacknowledged": 0,
        "hosts_unreachable_scheduled": 0, "hosts_unreachable_acknowledged": 0,
        "hosts_unreachable_disabled": 0, "hosts_pending": 0,
        "services_ok": 0, "services_warning": 0,
        "services_warning_unacknowledged": 0, "services_warning_host_problem": 0,
        "services_warning_scheduled": 0, "services_warning_acknowledged": 0,
        "services_warning_disabled": 0, "services_unknown": 0,
        "services_unknown_unacknowledged": 0,
        "services_unknown_host_problem": 0, "services_unknown_scheduled": 0,
        "services_unknown_acknowledged": 0, "services_unknown_disabled": 0,
        "services_critical": 0, "services_critical_unacknowledged": 0,
        "services_critical_host_problem": 0, "services_critical_scheduled": 0,
        "services_critical_acknowledged": 0, "services_critical_disabled": 0,
        "services_pending": 0 
      }

    ]

  }

}

我只想提取 hosts_up:9 或仅提取数字 9 ,尝试过很多例子,但效果并不好,请帮助我。

3 个答案:

答案 0 :(得分:2)

正如@ mklement0指出的那样,你可以写:

$ jq '.status.hostgroup_summary[].hosts_up' input.json
9

但请注意,.keyname技巧只有在密钥名称为字母数字且具有前导字母字符时才有效(可以理解_在此处算作字母字符)。一般来说,形式。[" KEY"]更健壮。因此,许多其他选择之一将是:

jq '.["status"]["hostgroup_summary"][] | .["hosts_up"]'

要发出对象,可以使用{ "KEY" }缩写:

$ jq '.status.hostgroup_summary[] | { "hosts_up" }' input.json
{
  "hosts_up": 9
}

如果您想要一种与" hosts_up"的确切位置(或位置)完全无关的方法。关键,考虑一下:

$ jq '.. | .hosts_up? | select(.)'

这将获取与" hosts_up"相关联的所有真实值。关键,如果有的话。 (Truthy这里既不是null也不是false。)如果你想获取与给定密钥相关的所有值,你必须检查密钥的存在:

$ jq '.. | select(type == "object" and has("hosts_up")) | .hosts_up'

使用最新版本的jq,最后一个版本可缩短为:

$ jq '.. | objects | select(has("hosts_up")) | .hosts_up'

答案 1 :(得分:2)

使用您的样本输入,提取感兴趣的值非常简单,使用正确构建的路径到感兴趣的键:

$ jq '.status.hostgroup_summary[0].hosts_up' file
9

顶级密钥hostgroup_summary的子密钥status数组,因此需要使用[0]来定位第一个元素。

任何JSON类型的值都可以通过这种方式检索,无论它是否为数字,从技术上讲,输出始终是 string ,但默认情况下jq保留JSON值格式化(数字和布尔值的未加引号输出,否则为双引号输出; JSON中的数组) 对于标量值,您可以添加选项-r(原始输出)以省略双引号。

如果数组包含多个条目,并且您想要提取所有 ,只需使用[]代替{{1 }}:

[0]

请注意,只有一个数组元素,结果是相同的,但如果您有多个数组元素,则每个值将打印在一个单独的行上。

返回整个

$ jq '.status.hostgroup_summary[].hosts_up' file
9

旁注:如果您的路径包含不以ASCII字母,数字或$ jq '.status.hostgroup_summary[] | { "hosts_up" }' file { "hosts_up": 9 } 开头的键,则必须双引号他们; e.g。

_

答案 2 :(得分:-3)

| jq -r '.[] | .[] | .[] | .hosts_up'  

上面的人..你的downvotes鼓励我越来越多地谷歌找到它的答案,希望我找到了它的确切答案。

参考 - Using jq to fetch key value from json output

我是系统管理员,我不能在这里展示所有热门和试用的内容..希望你能理解!