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。