​jq​

​jq​ 是一个命令行的 JSON 处理器。

  • 云服务 API:AWS, Azure, Google Cloud 的 CLI 工具返回的都是 JSON。
  • 监控告警:Prometheus, Zabbix, Grafana 发送的告警通知是 JSON。
  • 容器编排:Kubernetes API 返回的资源状态是 JSON。
  • CI/CD 工具:Jenkins, GitLab 的 API 交互也是 JSON。
  • 结构化日志:越来越多的应用采用 JSON 格式记录日志,便于机器解析。

​jq​ 解决了这个根本问题:它能“理解”JSON 的结构,通过键(key)来精确、可靠地提取、修改和重组数据。

jq​ 的核心功能演示

csp='{"Host_name":"192.168.xxx.xxx","Host_IP":"192.168.xxx.xxx","Time":"2020-10-15 11:00:00","Severity":"Average","Information":"MySQL: Server has aborted connections (over 3 for 5m)","Porject":"mysql.aborted_connects.rate","Detals":"Connections: Aborted connections per second:0","Status":"PROBLEM:8.858728","Original problem ID":"202010151105"}'

1. 格式化和高亮(最常用)

这是 jq​ 的“Hello, World!”。把混乱的单行 JSON 格式化为可读的多行形式。
​.​ (点号) 表示“整个输入对象”。

echo "$csp" | jq '.'

输出:

{
  "Host_name": "192.168.xxx.xxx",
  "Host_IP": "192.168.xxx.xxx",
  "Time": "2020-10-15 11:00:00",
  "Severity": "Average",
  "Information": "MySQL: Server has aborted connections (over 3 for 5m)",
  "Porject": "mysql.aborted_connects.rate",
  "Detals": "Connections: Aborted connections per second:0",
  "Status": "PROBLEM:8.858728",
  "Original problem ID": "202010151105"
}

2. 提取字段值

使用 .key​ 语法来获取特定字段的值。

# 获取告警信息
echo "$csp" | jq '.Information'
# 输出: "MySQL: Server has aborted connections (over 3 for 5m)"

# 如果不想要外面的双引号,使用 -r (raw output) 选项
echo "$csp" | jq -r '.Information'
# 输出: MySQL: Server has aborted connections (over 3 for 5m)

3. 提取多个字段并构建新对象

您可以选择几个字段,重新组合成一个新的 JSON 对象。

echo "$csp" | jq '{ip: .Host_IP, status: .Status, info: .Information}'
输出:
{
  "ip": "192.168.xxx.xxx",
  "status": "PROBLEM:8.858728",
  "info": "MySQL: Server has aborted connections (over 3 for 5m)"
}

4. 修改或添加字段(解决您的问题)

这正是我们之前讨论的,可以轻松地添加一个新字段。

echo "$csp" | jq '. + {CLEA: 1}'

输出(部分):

{
  ...
  "Original problem ID": "202010151105",
  "CLEA": 1  # <-- 新增的字段
}

5. 结合 Shell 脚本使用

​jq​ 的输出可以轻松赋值给 Shell 变量,让脚本处理逻辑变得清晰可靠。

# 从告警中提取 IP 地址和状态
HOST_IP=$(echo "$csp" | jq -r '.Host_IP')
STATUS=$(echo "$csp" | jq -r '.Status')

echo "告警来自 IP: $HOST_IP,当前状态是: $STATUS"
# 输出: 告警来自 IP: 192.168.xxx.xxx,当前状态是: PROBLEM:8.858728

总结

黄金法则:不要用正则表达式或 cut​/awk​ 来解析 JSON。请使用 jq​。

发表评论

邮箱地址不会被公开。 必填项已用*标注