如何使用jq迭代Nagios JSON

如何使用jq迭代Nagios JSON,json,nagios,jq,Json,Nagios,Jq,我试图弄清楚如何解析以下JSON,而不必在多个命令中显式指示数组索引。我只需要在一行上将主机组与所有主机信息关联起来 { "data": { "selectors": { }, "hostgroups": [ { "name": "ATL", "hosts": [ { "name": "ATL-SERVER1", "time_up": 2496629,

我试图弄清楚如何解析以下JSON,而不必在多个命令中显式指示数组索引。我只需要在一行上将主机组与所有主机信息关联起来

{
  "data": {
    "selectors": {
    },
    "hostgroups": [
      {
        "name": "ATL",
        "hosts": [
          {
            "name": "ATL-SERVER1",
            "time_up": 2496629,
            "time_down": 8970,
            "time_unreachable": 0,
            "scheduled_time_up": 0,
            "scheduled_time_down": 0,
            "scheduled_time_unreachable": 0,
            "time_indeterminate_nodata": 0,
            "time_indeterminate_notrunning": 0
          },
          {
            "name": "ATL-SERVER2",
            "time_up": 2505525,
            "time_down": 74,
            "time_unreachable": 0,
            "scheduled_time_up": 0,
            "scheduled_time_down": 0,
            "scheduled_time_unreachable": 0,
            "time_indeterminate_nodata": 0,
            "time_indeterminate_notrunning": 0
          }
        ]
      },
      {
        "name": "LAX",
        "hosts": [
          {
            "name": "LAX-SERVER1",
            "time_up": 2505599,
            "time_down": 0,
            "time_unreachable": 0,
            "scheduled_time_up": 0,
            "scheduled_time_down": 0,
            "scheduled_time_unreachable": 0,
            "time_indeterminate_nodata": 0,
            "time_indeterminate_notrunning": 0
          },
          {
            "name": "LAX-SERVER2",
            "time_up": 2505599,
            "time_down": 0,
            "time_unreachable": 0,
            "scheduled_time_up": 0,
            "scheduled_time_down": 0,
            "scheduled_time_unreachable": 0,
            "time_indeterminate_nodata": 0,
            "time_indeterminate_notrunning": 0
          }
        ]
      }
    ]
  }
}
以下命令将获得我需要的内容:

.data.hostgroups[0].name as $Group | {$Group} + .data.hostgroups[0].hosts[] | [.Group, .name, .time_up, .time_down, .time_unreachable, .scheduled_time_up, .scheduled_time_down, .scheduled_time_unreachable, .time_indeterminate_nodata, .time_indeterminate_notrunning] | @csv
.data.hostgroups[1].name as $Group | {$Group} + .data.hostgroups[1].hosts[] | [.Group, .name, .time_up, .time_down, .time_unreachable, .scheduled_time_up, .scheduled_time_down, .scheduled_time_unreachable, .time_indeterminate_nodata, .time_indeterminate_notrunning] | @csv
但我一直在想如何在一行中做到这一点。我有20个主机组,所以在我的脚本中有20个命令

我发现的所有类似示例似乎都只适用于从数组中提取单个字段(在我的示例中,它是host[])。例如,这将很好地工作:

map(.data.hostgroups | map({Group: .name, Host: .hosts[].name} | [.Group, .Host])) | add[] | @csv
输出为:

"ATL","ATL-SERVER1"
"ATL","ATL-SERVER2"
"LAX","LAX-SERVER1"
"LAX","LAX-SERVER2"
"ATL","ATL-SERVER1",2496629
"ATL","ATL-SERVER1",2505525
"ATL","ATL-SERVER2",2496629
"ATL","ATL-SERVER2",2505525
"LAX","LAX-SERVER1",2505599
"LAX","LAX-SERVER1",2505599
"LAX","LAX-SERVER2",2505599
"LAX","LAX-SERVER2",2505599
但当我在中添加一个附加字段时,例如:

map(.data.hostgroups | map({Group: .name, Host: .hosts[].name, Uptime: .hosts[].time_up} | [.Group, .Host, .Uptime])) | add[] | @csv
输出为:

"ATL","ATL-SERVER1"
"ATL","ATL-SERVER2"
"LAX","LAX-SERVER1"
"LAX","LAX-SERVER2"
"ATL","ATL-SERVER1",2496629
"ATL","ATL-SERVER1",2505525
"ATL","ATL-SERVER2",2496629
"ATL","ATL-SERVER2",2505525
"LAX","LAX-SERVER1",2505599
"LAX","LAX-SERVER1",2505599
"LAX","LAX-SERVER2",2505599
"LAX","LAX-SERVER2",2505599
对于我添加的每个字段,它基本上都将它们相乘。我很确定我理解为什么会这样,但我仍在试图找出如何在避免指数组合结果的问题的同时,把这一行排成一行

有人能帮我吗


谢谢

谢谢你,伙计。这对我很有效,我明白为什么现在有必要这样做。我看到了|.host[]是如何正确运行的,现在我了解了循环的工作原理。非常感谢!
$ cat extract.jq
.data.hostgroups[]
| .name as $Group
| .hosts[]
| [$Group, .name, .time_up, .time_down, .time_unreachable,
   .scheduled_time_up, .scheduled_time_down, 
   .scheduled_time_unreachable, .time_indeterminate_nodata, 
   .time_indeterminate_notrunning]
| @csv


$ jq -r -f extract.jq in.json
"ATL","ATL-SERVER1",2496629,8970,0,0,0,0,0,0
"ATL","ATL-SERVER2",2505525,74,0,0,0,0,0,0
"LAX","LAX-SERVER1",2505599,0,0,0,0,0,0,0
"LAX","LAX-SERVER2",2505599,0,0,0,0,0,0,0