简介
jq是标准的命令行 JSON 处理器:它从文件或标准输入读取 JSON,应用过滤器,然后打印结果。最简单的过滤器.仅用于美化打印。jq "." file.jsoncurl-s https://api.github.com/users/torvalds | jq "."echo'{"name": "Linux"}' | jq "."
各有优势的替代品:jaq(更快的 jq 克隆版)、dasel(同时支持 YAML、TOML、XML)、fx和jless(交互式查看器)、gron(使 JSON 可被 grep)、jo(创建 JSON)、jc(将经典命令输出转换为 JSON)。选择值
过滤器通过路径定位值:.key用于对象字段,[0]用于数组索引,[]用于遍历所有元素。-r以原始格式打印字符串(不带引号)。echo '{"name": "Linux"}' | jq ".name"jq ".user.address.city" file.jsonjq ".items[0]" file.jsonjq -r".items[].name" file.json
echo'{"name": "Linux"}' | dasel -r json '.name'echo'{"name": "Linux"}' | fx .nameecho'{"name": "Linux"}' | jshon -e name
过滤与转换
jq 过滤器通过|链式组合,就像 Shell 管道一样。select()保留匹配的元素,map()转换每个元素。jq '.items[] | select(.price > 10)' file.jsonjq '.items | map(.name)' file.jsonjq '.items | length' file.jsonjq 'keys' file.jsonjq '.items | sort_by(.price)' file.json
jq '.items[] | {title: .name, cost: .price}' file.json
修改
使用=设置或添加字段,使用del()删除字段。jq 从不会原地编辑;将输出重定向到新文件。echo '{"name": "Linux"}' | jq '.year = 1991'echo '{"name": "Linux", "year": 1991}' | jq 'del(.year)'echo '{"name": "Linux"}' | dasel put string -r json '.year' '1991'echo '{"name": "Linux", "year": 1991}' | dasel delete -r json '.year'
创建
jo从 Shell 参数构建 JSON;jq -n仅从过滤器构建。jo -pname=Linux year=1991jq -n'{name: "Linux", year: 1991}'
Grep 与探索
gron将 JSON 扁平化为离散的赋值语句,以便使用普通的grep搜索,然后用-u重新组装。jless和fx以折叠和搜索功能交互式浏览大型文档。gron file.json | grep"name"gron file.json | grep"name" | gron -ujless file.jsonfx file.json
转换
yq将 jq 风格的过滤器应用于 YAML,dasel在不同格式间转换。jc将经典命令的输出转换为 JSON,以便用 jq 处理。yq ".name" config.yamldasel -r json -w yaml < file.jsonjc ifconfig | jq ".[0].ipv4_addr"
机器友好的紧凑输出:jq -c每个文档打印一行,适用于 JSON Lines 流。