我的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 ,尝试过很多例子,但效果并不好,请帮助我。
答案 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
我是系统管理员,我不能在这里展示所有热门和试用的内容..希望你能理解!