아래 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만 사용하면 가능합니까?
나는 sed 명령을 jq와 함께 사용했습니다.
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가 더 이상 JSON 이스케이프되지 않도록 @csv
함께 ).-r
귀하의 코드가 실제로 예제 출력과 일치하지 않고 반복/중첩 데이터로 무엇을 해야 할지 명확하지 않기 때문에 귀하의 요구 사항이 무엇인지 정확히 알 수 없지만 다음은 부분적으로 작동하는 예제입니다.
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입니다.