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% 循环折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。