Text-Formatting
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";
是的,事實上僅在 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。