【问题标题】:How to use jq to iterate through Nagios JSON如何使用 jq 遍历 Nagios JSON
【发布时间】:2016-03-02 22:31:12
【问题描述】:

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

对于我添加的每个字段,它基本上将它们相乘。而且我很确定我明白为什么会这样,但我仍在试图弄清楚如何在避免以指数方式组合结果的问题的同时将其统一起来。

谁能帮帮我?

谢谢!

【问题讨论】:

    标签: json nagios jq


    【解决方案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
    

    【讨论】:

    • 非常感谢。它对我有用,我明白为什么现在有必要这样做。我怎么看 | .host[] 运行正常,我了解循环现在是如何工作的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多