jq:為 csv 輸出建構過濾器

jq:為 csv 輸出建構過濾器

我有以下 JSON 檔案:

{
"result": [
{
  "hostid": "12607",
  "name": "love",
  "host": "loveyou",
  "status": "0",
  "groups": [
    {
      "groupid": "47",
      "name": "Flower"
    },
    {
      "groupid": "145",
      "name": "Sun"
    }
  ],
  "triggers": [
    {
      "triggerid": "211498",
      "description": "The host is unavailable by ICMP",
      "status": "0"
    },
    {
      "triggerid": "211499",
      "description": "CPU load above {$CPU}% ({ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211500",
      "description": "The host has just been restarted (SysUptime {ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211501",
      "description": "Sem resposta SNMP. Community {$SNMP_COMMUNITY}",
      "status": "0"
    },
    {
      "triggerid": "211574",
      "description": "Memory Usage is over {$MEM}% ({ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211575",
      "description": "Free disk space is less than {$DISK}% on volume C:\\\\ Label:  Serial Number 1ab4e15c ({ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211576",
      "description": "Free disk space is less than {$DISK}% on volume E:\\\\ Label:NETAPP_LUN_01  Serial Number 84048285 ({ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211577",
      "description": "Free disk space is less than {$DISK}% on volume F:\\\\ Label:NETAPP_LUN_02  Serial Number 6426fd9 ({ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211578",
      "description": "Free disk space is less than {$DISK}% on volume G:\\\\ Label:NETAPP_LUN_03  Serial Number 184b60f9 ({ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211579",
      "description": "Free disk space is less than {$DISK}% on volume H:\\\\ Label:NETAPP_LUN_04  Serial Number 88541457 ({ITEM.LASTVALUE})",
      "status": "0"
    },
    {
      "triggerid": "211580",
      "description": "Free disk space is less than {$DISK}% on volume I:\\\\ Label:NETAPP_LUN_07  Serial Number f23669bc ({ITEM.LASTVALUE})",
      "status": "0"
    }
  ],
  "interfaces": [
    {
      "interfaceid": "2394",
      "ip": "192.168.1.190"
    },
    {
      "interfaceid": "2399",
      "ip": "192.168.1.190"
    }
  ]
}

我想要一個以下格式的 CSV 檔案:

NAME, GROUP, IP,           DESCRIPTION
love, Sun, 192.168.1.190, The host is unavailable by ICMP
love, Sun, 192.168.1.190 , CPU load above {$CPU}% ({ITEM.LASTVALUE})
love, Sun, 192.168.1.190 , The host has just been restarted

僅使用 jq 可以嗎?

我與 jq 一起使用 sed 命令:

CLIENTE=`echo "$RESULT" | jq -r .result[].groups[].name | sort | grep -m1 Cliente`
VISIBLENAME=`echo "$RESULT" | jq -r .result[].name | sed 's/ //g'`
HOST=`echo "$RESULT" | jq -r .result[].host | sed 's/ /_/g'`
IP=`echo "$RESULT" | jq -r .result[].interfaces[0].ip`
TRIGGERS=`echo "$RESULT" | jq -r .result[].triggers[].description | sed 's/ /_/g'`
TRIGSTATUS=`echo "$RESULT" | jq -r .result[].triggers[].status | sed 's/0/enabled/g;s/1/disabled/g'`
PRIORITY=`echo "$RESULT" | jq -r .result[].triggers[].priority | sed 's/0/notclassified/g;s/1/information/g;s/2/warning/g;s/3/average/g;s/4/high/g;s/5/disaster/g'`
ACTIVEHOST=`echo "$RESULT" | jq -r .result[].status | sed 's/0/monitored/g;s/1/unmonitored/g'`
TSTATUS=`paste <(echo "$TRIGGERS") <(echo "$TRIGSTATUS") <(echo "$PRIORITY")| sed 's/[[:space:]]/;/g'

echo "$CLIENTE;$VISIBLENAME;$HOST;$IP;$j;$ACTIVEHOST";

答案1

是的,事實上它是更輕鬆只用JQ就可以做到。您必須使用 JQ 過濾器將所需的行建置為數組,然後使用該@csv過濾器以 CSV 格式輸出該行(同時,-r以便 CSV 不會進一步進行 JSON 轉義)。

我不清楚您的具體要求是什麼,因為您的程式碼與範例輸出並不真正匹配,並且如何處理重複/嵌套資料並不明顯,但這是一個部分有效的範例:

jq -r '.result[] | . as $result 
  | .triggers[] 
  | [$result.name, $result.groups[0].name, $result.interfaces[0].ip, .description] 
  | @csv'

根據您的測試數據,輸出

"love","Flower","192.168.1.190","The host is unavailable by ICMP"
"love","Flower","192.168.1.190","CPU load above {$CPU}% ({ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","The host has just been restarted (SysUptime {ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","Sem resposta SNMP. Community {$SNMP_COMMUNITY}"
"love","Flower","192.168.1.190","Memory Usage is over {$MEM}% ({ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","Free disk space is less than {$DISK}% on volume C:\\ Label:  Serial Number 1ab4e15c ({ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","Free disk space is less than {$DISK}% on volume E:\\ Label:NETAPP_LUN_01  Serial Number 84048285 ({ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","Free disk space is less than {$DISK}% on volume F:\\ Label:NETAPP_LUN_02  Serial Number 6426fd9 ({ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","Free disk space is less than {$DISK}% on volume G:\\ Label:NETAPP_LUN_03  Serial Number 184b60f9 ({ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","Free disk space is less than {$DISK}% on volume H:\\ Label:NETAPP_LUN_04  Serial Number 88541457 ({ITEM.LASTVALUE})"
"love","Flower","192.168.1.190","Free disk space is less than {$DISK}% on volume I:\\ Label:NETAPP_LUN_07  Serial Number f23669bc ({ITEM.LASTVALUE})"

引用超出了您的要求,但它是完全有效的 CSV。

相關內容