jq:命令行 JSON 处理利器
jq 是一个轻量级、灵活的命令行 JSON 处理器。
基本过滤
# 美化输出
echo '{"name":"Alice","age":30}' | jq '.'
# 获取字段
echo '{"name":"Alice","age":30}' | jq '.name'
# 输出: "Alice"
# 获取嵌套字段
echo '{"user":{"email":"alice@example.com"}}' | jq '.user.email'
# 获取数组元素
echo '[1,2,3]' | jq '.[1]'
# 输出: 2
# 数组切片
echo '[1,2,3,4,5]' | jq '.[2:4]'
# 输出: [3,4]
数组操作
# 获取所有元素
curl https://api.example.com/users | jq '.[]'
# 映射数组
curl https://api.example.com/users | jq '[.[] | {id, name, email}]'
# 过滤数组
curl https://api.example.com/users | jq '[.[] | select(.active == true)]'
# 获取数组长度
curl https://api.example.com/users | jq 'length'
# 首/末元素
curl https://api.example.com/users | jq 'first, last'
转换
# 构建新对象
echo '{"first":"John","last":"Doe"}' | jq '{fullName: (.first + " " + .last)}'
# 添加字段
echo '{"name":"Alice"}' | jq '. + {role: "admin"}'
# 删除字段
echo '{"name":"Alice","password":"secret"}' | jq 'del(.password)'
# 重命名字段
echo '{"user_name":"alice"}' | jq '{username: .user_name}'
字符串操作
# 字符串插值
echo '{"name":"World"}' | jq '"Hello, \(.name)!"'
# 分割/连接
echo '"a,b,c"' | jq 'split(",")'
echo '["a","b","c"]' | jq 'join(",")'
# 字符串测试
echo '{"url":"https://api.example.com"}' | jq 'select(.url | startswith("https"))'
实际示例
# 提取 Docker 镜像名称
docker ps --format '{{json .}}' | jq -r '.Image'
# 解析 AWS CLI 输出
aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [.InstanceId, .State.Name] | @tsv'
# 处理 GitHub API
curl https://api.github.com/repos/owner/repo/releases | jq -r '.[0] | {tag: .tag_name, date: .published_at}'
# 解析 Kubernetes Pods
kubectl get pods -o json | jq -r '.items[] | select(.status.phase != "Running") | .metadata.name'
变量和函数
# 定义变量
echo '5' | jq '. as $x | $x * $x'
# 归约
echo '[1,2,3,4,5]' | jq 'reduce .[] as $x (0; . + $x)'
# 输出: 15
# 分组
echo '[{"type":"a","val":1},{"type":"b","val":2},{"type":"a","val":3}]' | jq 'group_by(.type)'
jq 将复杂的 API 响应转换为您所需的确切数据。