Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays JQ未解析所需的输出,无法获取带有字符串的数字_Arrays_Json_Bash_Curl_Jq - Fatal编程技术网

Arrays JQ未解析所需的输出,无法获取带有字符串的数字

Arrays JQ未解析所需的输出,无法获取带有字符串的数字,arrays,json,bash,curl,jq,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_a

我的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\u up:9或数字9,尝试了许多示例,但效果不理想,请帮助我。

正如@mklement0所指出的,您可以写:

$ jq '.status.hostgroup_summary[].hosts_up' input.json
9
但是,请注意,.keyname技巧仅在密钥名为字母数字且具有前导字母字符时有效。可以理解,uu在这里被视为字母字符。通常,表单[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\u up键关联的所有truthy值(如果有)。Truthy在这里既不是空的也不是假的。如果要获取与给定键关联的所有值,则必须检查该键是否存在:

$ 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
子密钥hostgroup_顶级密钥状态的摘要是一个数组,因此需要使用[0]以第一个元素为目标

任何JSON类型的值都可以通过这种方式检索,无论它是否是数字,从技术上讲,输出总是一个字符串,尽管jq默认情况下保留JSON值格式的数字和布尔值的无引号输出,否则保留双引号输出;与JSON中的数组相同。 对于标量值,可以添加选项-r raw output以省略双引号

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

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

要将条目作为一个整体返回,以及作为包含键的JSON字符串返回,请使用以下命令,如回答中所示:

旁注:如果您的路径包含的键不是以ASCII字母、数字或_开头,则必须对它们进行双引号;e、 g

$ jq '.status."0key"' <<<'{ "status": { "0key": 9 } }' # Note the "..." around 0key
9

我是新来的。。试图格式化。。但事情进展得并不顺利。。但不希望以-1的票数被否决。。奇怪的是,你们竟然投了反对票,而不是用正确的方式鼓励人们。你们能至少展示一件你们尝试过但失败的事情吗?我们手上有很多尝试过的例子,它确实会让人皱眉,而不是具体地表现出努力,而不仅仅是指它的支出。准确显示您尝试的内容也意味着我们可以准确确定您对该语言的误解,并在这方面提供更有用的答案。@mklement0,如果每个没有否决的人都添加了这样的评论,那么我们将有无法管理的评论源。:这次也不是我,但我能理解为什么有人会这样;标题提出了一个广泛的主张,但内容并没有通过显示来支持这一主张,即,可以使用字符串获取非数字内容,或者可以使用字符串获取内容,或者问题适用于比OP的实际用例更简单的数据结构,等等;试着建立一个新的系统会非常清晰。点头。不管怎么说,如果OP在这里参与,我很乐意帮助改进这个问题,尽管他们已经得到了一个好的答案,但值得尝试树立一个榜样,说明一个问题的理想形式是什么样的,这样未来的问题会更受欢迎,我想,如果这个问题最终解决为一个潜在的误解,而这个误解在知识库中还没有出现,那么这个问题可能会赢得一些支持。希望这一切都能在这里发生。在上面的人。。你的反对票鼓励我越来越多地用谷歌搜索它的答案,希望我能找到确切的答案。@KunalSaha,实际上我认为peak的答案更准确,因为它查看了你指定的数据中你想要的信息的确切位置;鉴于。[]而不是status在所有键下查找,与给定的特定键相反。如果你想在所有键下查看,那应该在问题中指定。位置不可知技术很棒。至于。[]:不幸的是,从v1.5开始,它只作为一个过滤器单独工作,而不是作为路径的一部分。尽管没有提到,但仅仅是重复引用路径的各个键就可以了,这让我觉得是更好的方法。比较jq'.status.0key'@mklement0-[KEY]在jq的所有版本中都有效,但.keyname相对较晚。还有,[KEY1]|[K
EY2]可以缩写为:jq-n'{a:{b:{c:1}}}}}.[a][b][c]'..顺便说一句,我们都很好,我们中的很多人都在jq和bash标签中,不管怎样,都是系统管理员。我们并不是要求您展示包含专有数据的工作产品;相反,我们要求你们将问题分解到最小的复制机上,并展示该复制机。请参阅或,以获取我们对显示问题的代码示例的期望的详细指南。这不仅仅是繁忙的工作:它有助于确保答案将是有用的,并使你的问题对其他人有用,这是整个网站的重点!事实上,我支持这一点:这与你在问题中提供的数据不符。在JQ1.5中,复制并粘贴问题中的精确数据,我得到jq:error at:32:Cannot iterate over string 1.8.0。因此,这个答案可能适用于你的真实数据,但在这个问题的上下文中,它是错误的。@KunalSaha:反对票不是一成不变的。如果你改进了你的问题,未来的读者可能会投票支持它。以上这些人很可能早已不在人世了,但与这里与你接触的人不同,他们并不是落选的选民,添加一个与仍然措辞拙劣的问题不匹配的答案将对任何人都有利,撇开目前形式的答案甚至不起作用。@charlesduff是正确的。提出的方法是可疑的,但它可以通过在查询上撒足够多的后缀来实现。对于给定的数据,恰好只有一个就足够了:jq-r'.[].[].?|。[]主持会议。然而,更好的不可知论方法可能是:jq-r'。主持会议选择“.”…至于格式化,如果您选择一块代码并单击编辑器中的{}按钮,就可以了。
$ jq '.status.hostgroup_summary[].hosts_up' file
9
$ jq '.status.hostgroup_summary[] | { "hosts_up" }' file
{
  "hosts_up": 9
}
$ jq '.status."0key"' <<<'{ "status": { "0key": 9 } }' # Note the "..." around 0key
9