Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-解析JSON以与XDB一起使用_Json_Bash_Jq_Influxdb - Fatal编程技术网

Bash-解析JSON以与XDB一起使用

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

我已经成功地编写了一些简单的脚本来解析json中的数据,以便导入到XDB中(并在Grafana中查看),但这一个脚本比我以前使用的要复杂得多。Cisco UCCX/Finesse的VoiceCSQDetailsStats API如下所示。我想做的是让一个循环来解析下面的json,并使用底部卷曲轮询单个用户数据(agentId、agentName、agentState和基于每个id的agentState持续时间)到XDB。我将如何使用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
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(…)
将生成no
curl
请求

如果需要,可以这样展开:

$ 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