jq JSON 数据处理命令教程
jq 是一款轻量级的命令行 JSON 处理器,被称为 JSON 版的 AWK。在搬瓦工 VPS 上,无论是解析 API 返回的 JSON 数据、处理 Docker 容器信息,还是编辑配置文件,jq 都能让你在终端中高效地处理 JSON。本教程将从安装开始,系统讲解 jq 的各种用法。
一、安装 jq
Ubuntu / Debian
apt update
apt install jq -y
CentOS / RHEL
yum install epel-release -y
yum install jq -y
验证安装:
jq --version
二、基础操作
2.1 格式化输出
# 格式化 JSON(美化输出)
echo '{"name":"搬瓦工","type":"VPS"}' | jq .
# 紧凑输出
echo '{"name": "搬瓦工", "type": "VPS"}' | jq -c .
# 从文件读取
jq . config.json
# 不带引号输出字符串
echo '{"name":"搬瓦工"}' | jq -r .name
2.2 字段提取
# 提取单个字段
echo '{"name":"搬瓦工","plan":"THE PLAN","price":49.99}' | jq '.name'
# 提取嵌套字段
echo '{"server":{"ip":"1.2.3.4","port":22}}' | jq '.server.ip'
# 提取多个字段
echo '{"name":"搬瓦工","plan":"THE PLAN","price":49.99}' | jq '{name, price}'
# 处理特殊字段名
echo '{"server-name":"web01"}' | jq '.["server-name"]'
2.3 数组操作
# 获取数组元素
echo '[1,2,3,4,5]' | jq '.[0]' # 第一个元素
echo '[1,2,3,4,5]' | jq '.[-1]' # 最后一个元素
echo '[1,2,3,4,5]' | jq '.[2:4]' # 切片
# 遍历数组
echo '[{"name":"web01"},{"name":"web02"}]' | jq '.[].name'
# 数组长度
echo '[1,2,3,4,5]' | jq 'length'
# 添加元素
echo '[1,2,3]' | jq '. + [4,5]'
# 数组去重
echo '[1,2,2,3,3,3]' | jq 'unique'
# 排序
echo '[3,1,4,1,5,9]' | jq 'sort'
三、高级过滤
3.1 条件过滤
# select 过滤
echo '[{"name":"web01","cpu":80},{"name":"web02","cpu":30},{"name":"db01","cpu":95}]' | \
jq '.[] | select(.cpu > 70)'
# 字符串匹配
echo '[{"name":"web01"},{"name":"db01"},{"name":"web02"}]' | \
jq '.[] | select(.name | startswith("web"))'
# 包含匹配
echo '[{"name":"web01"},{"name":"db01"}]' | \
jq '.[] | select(.name | contains("web"))'
# 正则匹配
echo '[{"name":"web01"},{"name":"db01"},{"name":"web02"}]' | \
jq '.[] | select(.name | test("^web[0-9]+$"))'
3.2 数据转换
# map 转换数组元素
echo '[1,2,3,4,5]' | jq 'map(. * 2)'
# 构造新对象
echo '[{"first":"张","last":"三","age":25}]' | \
jq '.[] | {fullname: (.first + .last), age}'
# 类型转换
echo '{"port":"8080"}' | jq '.port | tonumber'
echo '{"count":42}' | jq '.count | tostring'
# 条件表达式
echo '[{"name":"web","status":"running"},{"name":"db","status":"stopped"}]' | \
jq '.[] | {name, healthy: (.status == "running")}'
3.3 聚合统计
# 求和
echo '[{"price":10},{"price":20},{"price":30}]' | jq '[.[].price] | add'
# 最大值最小值
echo '[3,1,4,1,5,9]' | jq 'max'
echo '[3,1,4,1,5,9]' | jq 'min'
# 分组
echo '[{"type":"web","name":"w1"},{"type":"db","name":"d1"},{"type":"web","name":"w2"}]' | \
jq 'group_by(.type) | map({type: .[0].type, count: length})'
# 计数
echo '[{"status":200},{"status":404},{"status":200},{"status":500}]' | \
jq 'group_by(.status) | map({status: .[0].status, count: length})'
四、实际应用场景
4.1 处理 Docker 输出
# 获取运行中容器的名称和状态
docker inspect $(docker ps -q) | jq '.[] | {name: .Name, status: .State.Status, ip: .NetworkSettings.IPAddress}'
# 查看容器端口映射
docker inspect my-container | jq '.[0].NetworkSettings.Ports'
# 获取镜像列表并格式化
docker images --format '{{json .}}' | jq -s 'sort_by(.Size) | reverse | .[] | {repository: .Repository, tag: .Tag, size: .Size}'
4.2 解析 API 响应
# 搬瓦工 API 调用(使用 bwh81.net)
curl -s "https://api.64clouds.com/v1/getServiceInfo?veid=YOUR_VEID&api_key=YOUR_KEY" | \
jq '{plan: .plan, os: .os, ip: .ip_addresses, ram: .plan_ram, disk: .plan_disk}'
# 解析 GitHub API
curl -s "https://api.github.com/repos/torvalds/linux/releases/latest" | \
jq '{tag: .tag_name, date: .published_at, body: .body[:100]}'
# 批量请求并合并结果
for i in 1 2 3; do
curl -s "https://api.example.com/page/$i"
done | jq -s 'flatten'
4.3 配置文件处理
# 修改 JSON 配置
jq '.database.port = 5432 | .database.host = "localhost"' config.json > config_new.json
# 合并两个 JSON 文件
jq -s '.[0] * .[1]' base.json override.json
# 删除字段
jq 'del(.password, .secret)' config.json
# 添加新字段
jq '. + {"created_at": now | strftime("%Y-%m-%d")}' data.json
# 将 JSON 转为环境变量格式
jq -r 'to_entries | .[] | "\(.key)=\(.value)"' config.json
五、jq 脚本编写
# 将 jq 过滤器保存到文件
cat > filter.jq <<'EOF'
.[] |
select(.status == "active") |
{
name: .name,
uptime: .uptime_days,
health: (if .cpu < 80 then "good" else "warning" end)
}
EOF
# 使用过滤器文件
jq -f filter.jq servers.json
# 在 Bash 脚本中使用 jq
#!/bin/bash
SERVERS=$(cat servers.json)
echo "$SERVERS" | jq -r '.[] | .ip' | while read -r IP; do
echo "检查服务器: $IP"
ping -c 1 -W 2 "$IP" &>/dev/null && echo " 在线" || echo " 离线"
done
六、常用技巧
# 处理非标准 JSON(每行一个 JSON 对象)
cat logs.jsonl | jq -c 'select(.level == "error")'
# 将 CSV 转为 JSON
echo "name,age
张三,25
李四,30" | jq -R -s 'split("\n") | .[1:-1] | map(split(",")) | map({"name": .[0], "age": .[1]})'
# 生成 JSON
jq -n '{name: "test", ports: [80, 443], enabled: true}'
# 环境变量传入
NAME="搬瓦工" jq -n --arg name "$NAME" '{server: $name}'
# 递归查找所有键
echo '{"a":{"b":{"c":1}}}' | jq '[paths | join(".")]'
总结
jq 是命令行下处理 JSON 数据的必备工具。在搬瓦工 VPS 上,jq 可以帮你解析 API 响应、处理 Docker 输出、管理 JSON 配置文件。掌握 jq 配合 Curl 与 Wget 使用,能极大提升日常运维效率。建议同时学习 Bash 脚本编程,将 jq 融入自动化工作流中。选购搬瓦工 VPS 请参考全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 循环折扣。