如何使用jq迭代Nagios JSON

时间:2016-03-02 22:31:12

标签: json nagios jq

我正在试图弄清楚如何解析以下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"

但是当我添加一个额外的字段时,例如:

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

输出结果为:

"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

对于我添加的每个字段,它基本上将它们相乘。而且我很确定我理解为什么会这样,但是我仍在努力弄清楚如何在避免指数组合结果的问题的同时进行一行。

任何人都可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

$ 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