Bash-解析JSON以与XDB一起使用
我已经成功地编写了一些简单的脚本来解析json中的数据,以便导入到XDB中(并在Grafana中查看),但这一个脚本比我以前使用的要复杂得多。Cisco UCCX/Finesse的VoiceCSQDetailsStats API如下所示。我想做的是让一个循环来解析下面的json,并使用底部卷曲轮询单个用户数据(agentId、agentName、agentState和基于每个id的agentState持续时间)到XDB。我将如何使用bash来实现这一点 将以下数据保存为以下变量:Bash-解析JSON以与XDB一起使用,json,bash,jq,influxdb,Json,Bash,Jq,Influxdb,我已经成功地编写了一些简单的脚本来解析json中的数据,以便导入到XDB中(并在Grafana中查看),但这一个脚本比我以前使用的要复杂得多。Cisco UCCX/Finesse的VoiceCSQDetailsStats API如下所示。我想做的是让一个循环来解析下面的json,并使用底部卷曲轮询单个用户数据(agentId、agentName、agentState和基于每个id的agentState持续时间)到XDB。我将如何使用bash来实现这一点 将以下数据保存为以下变量: jsonAge
jsonAgentId="id"
jsonAgentName="agentName"
jsonAgentState="agentState"
jsonAgentStateDuration="agentStateDuration"
<file jq -r '.VoiceCSQDetailsStats | [ .agentId,.agentName,.agentState,.agentStateDuration ] | @tsv' \
| while IFS=$'\t' read jsonAgentId jsonAgentName jsonAgentState jsonAgentStateDuration; do
echo -e "jsonAgentId=${jsonAgentId}\njsonAgentName=${jsonAgentName}\njsonAgentState=${jsonAgentState}\njsonAgentStateDuration=${jsonAgentStateDuration}\n";
done
VoiceCSQDetailsStats json:
{
"id": "muser",
"operation": "UPDATE",
"VoiceCSQDetailsStats": {
"agentId": "muser",
"agentName": "My User",
"agentState": "Not Ready",
"skillGroup": "",
"agentStateDuration": 982761,
"reason": "Break",
"AgentVoiceCSQNames": [
{
"agentVoiceCSQName": "Dispatcher"
},
{
"agentVoiceCSQName": "NOCEscalation"
},
{
"agentVoiceCSQName": "NOCHelpdesk"
}
]
}
}
{
"id": "yuser",
"operation": "UPDATE",
"VoiceCSQDetailsStats": {
"agentId": "yuser",
"agentName": "Your User",
"agentState": "Talking",
"skillGroup": "",
"agentStateDuration": 626160,
"reason": "",
"AgentVoiceCSQNames": [
{
"agentVoiceCSQName": "Dispatcher"
},
{
"agentVoiceCSQName": "NOCHelpdesk"
}
]
}
}
{
"id": "euser",
"operation": "UPDATE",
"VoiceCSQDetailsStats": {
"agentId": "euser",
"agentName": "Everyones User",
"agentState": "Ready",
"skillGroup": "",
"agentStateDuration": 203631,
"reason": "",
"AgentVoiceCSQNames": [
{
"agentVoiceCSQName": "NOCHelpdesk"
},
{
"agentVoiceCSQName": "NOCEscalation"
}
]
}
}
{
"id": "duser",
"operation": "UPDATE",
"VoiceCSQDetailsStats": {
"agentId": "duser",
"agentName": "Dumb User",
"agentState": "Not Ready",
"skillGroup": "",
"agentStateDuration": 175342,
"reason": "Call Not Answered",
"AgentVoiceCSQNames": [
{
"agentVoiceCSQName": "NOCEscalation"
},
{
"agentVoiceCSQName": "NOCHelpdesk"
}
]
}
}
{
"id": "fuser",
"operation": "UPDATE",
"VoiceCSQDetailsStats": {
"agentId": "fuser",
"agentName": "Foolish User",
"agentState": "Not Ready",
"skillGroup": "",
"agentStateDuration": 1057520,
"reason": "Offhook",
"AgentVoiceCSQNames": [
{
"agentVoiceCSQName": "NOCEscalation"
},
{
"agentVoiceCSQName": "NOCHelpdesk"
}
]
}
}
{
"id": "druser",
"operation": "UPDATE",
"VoiceCSQDetailsStats": {
"agentId": "druser",
"agentName": "Drug User",
"agentState": "Talking ( from CSQ: NOCHelpdesk )",
"skillGroup": "NOCHelpdesk",
"agentStateDuration": 167914,
"reason": "Offhook",
"AgentVoiceCSQNames": [
{
"agentVoiceCSQName": "NOCEscalation"
},
{
"agentVoiceCSQName": "NOCHelpdesk"
}
]
}
}
发送到XDB:
curl -i -XPOST "$influxdbIP:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=$jsonAgentId value=$jsonAgentName"
curl -i -XPOST "$influxdbIP:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=$jsonAgentId value=$jsonAgentState"
curl -i -XPOST "$influxdbIP:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=$jsonAgentId value=$jsonAgentStateDuration"
使用jq时,我曾考虑过执行以下操作,但我仍然需要它在用户之间循环,并在jq-c“[n]”返回null时停止
curl 'http://10.10.66.16:9080/realtime/VoiceCSQDetailsStats' | jq -c '.[6]' | grep -oP '(?<="id":")[^."]*'
druser
curl 'http://10.10.66.16:9080/realtime/VoiceCSQDetailsStats' | jq -c '.[6]' | grep -oP '(?<="agentName":")[^."]*'
Drug User
curl 'http://10.10.66.16:9080/realtime/VoiceCSQDetailsStats' | jq -c '.[6]' | grep -oP '(?<="agentState":")[^."]*'
Ready
curl 'http://10.10.66.16:9080/realtime/VoiceCSQDetailsStats' | jq -c '.[6]' | grep -oP '(?<="agentStateDuration":)[^.,]*'
167914
curl 'http://10.10.66.16:9080/realtime/VoiceCSQDetailsStats' | jq -c '.[6]' | grep -oP '(?<="reason":")[^."]*'
Offhook
curl'http://10.10.66.16:9080/realtime/VoiceCSQDetailsStats“|jq-c”。[6]“|grep-oP”(?您可以使用jq
提取所需字段,并为bash
变量赋值:
jsonAgentId="id"
jsonAgentName="agentName"
jsonAgentState="agentState"
jsonAgentStateDuration="agentStateDuration"
<file jq -r '.VoiceCSQDetailsStats | [ .agentId,.agentName,.agentState,.agentStateDuration ] | @tsv' \
| while IFS=$'\t' read jsonAgentId jsonAgentName jsonAgentState jsonAgentStateDuration; do
echo -e "jsonAgentId=${jsonAgentId}\njsonAgentName=${jsonAgentName}\njsonAgentState=${jsonAgentState}\njsonAgentStateDuration=${jsonAgentStateDuration}\n";
done
我的解决方案是让jq
为您编写curl
命令:
开始很简单:只需获取一个包含所需数据的对象
结束
如果这些字段中有任何字段丢失或为空,select(…)
将生成nocurl
请求
如果需要,可以这样展开:
$ influxdbIP=1.2.3.4 jq -r '.VoiceCSQDetailsStats | { id: .agentId, name: .agentName, state: .agentState, stateDuration: .agentStateDuration } | select(.id and .name and .state and .stateDuration and ( .state != "Not Ready" ) ) | .id as $id | ( .name, .state, .stateDuration) | "curl -i -XPOST \"\( $ENV | .influxdbIP):8086/write?db=nocdb\" --data-binary \"uccxstats,host=uccx,user=\($id) value=\(.)\""' < eptesicus.json
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=yuser value=Your User"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=yuser value=Talking"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=yuser value=626160"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=euser value=Everyones User"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=euser value=Ready"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=euser value=203631"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=druser value=Drug User"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=druser value=Talking ( from CSQ: NOCHelpdesk )"
curl -i -XPOST "1.2.3.4:8086/write?db=nocdb" --data-binary "uccxstats,host=uccx,user=druser value=167914"
$influxdbIP=1.2.3.4 jq-r'.VoiceCSQDetailsStats{id:.agentId,name:.agentName,state:.agentState,stateDuration:.agentStateDuration}选择(.id and.name and.state and.stateDuration and(.state!=“Not Ready”))|.id作为$id |(.name,.state,.stateDuration)|“curl-i-XPOST\”\($ENV |.influxd):8086/write?db=nocdb\“--data binary\”uccxstats,host=uccx,user=\($id)value=\(.\”“”
请注意,它不会为处于“未就绪”状态的代理生成任何curl
请求".不要在bash中执行此操作。使用专门设计用于解析JSON的应用程序。这是一个不错的选择。Jq正是我所想的,并且已经更新了我的初始帖子。但是,我仍然需要它循环并发送到XDB,所以我需要bash、python或其他任何东西来执行此操作。只需拥有并循环文件即可运行您的应用程序curl.在bash中循环文件中的行是一个非常正常的愉快路径。这jq
和bash
都可以用来做他们擅长的事情,而不需要交叉路径。基本上,这里真正的问题陈述是“如何在命令行上将此json展平为平面文件/分隔格式,以便在bash循环中读取”,答案是jq
。