繁体   English   中英

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

[英]JQ not parsing desired output, can't fetch numbers with string

我的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 ,尝试了许多示例,但效果不佳,请帮帮我。

正如@ 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'

使用样本输入,使用适当构造的感兴趣关键的路径即可轻松提取感兴趣的值

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

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

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


如果数组包含多个条目,并且您要提取所有条目 ,则只需使用[]而不是[0]

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

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


返回进入/ IES 作为一个整体 ,作为包含密钥字符串JSON以及,使用下面的一样,也表现在峰值的答案:

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

附带说明:如果您的路径包含以ASCII字母,数字或_开头的键,则必须将其双引号否则 ,必须使用双引号 例如

$ jq '.status."0key"' <<<'{ "status": { "0key": 9 } }' # Note the "..." around 0key
9
| jq -r '.[] | .[] | .[] | .hosts_up'  

伙计之上..您的不赞成投票鼓励我越来越多地在Google上找到答案,希望我找到了确切的答案。

参考- 使用jq从json输出中获取键值

我是系统管理员,所以我无法一直在这里展示我所有的热门歌曲和试用版..希望您能理解!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM