jq 入门:用命令行读懂 JSON 数据
调接口时,curl 返回的 JSON 常常挤成一行,很难一眼找到想要的字段。写 Python 脚本又要建文件、写导入、处理异常,只是临时看一眼数据,实在太重。jq 是轻量的命令行 JSON 处理器,输入 JSON,输出想要的那一部分,适合在终端随手使用。
安装 jq
Debian 或 Ubuntu 用 sudo apt install jq,Fedora 或 RHEL 用 sudo dnf install jq,macOS 用 brew install jq。运行 jq --version,能看到版本号即已就绪。
第一个命令
echo '{"name":"denny","age":40}' | jq .
点号表示原样输出整个输入,jq 会把一行 JSON 重新排版:
{
"name": "denny",
"age": 40
}
先用 jq . 看清结构,再决定取什么。
取字段
取顶层字段:echo '{"name":"denny","age":40}' | jq .name,得到 "denny"。嵌套对象一层层写下去:jq .user.name。数组下标从 0 开始:jq .items[0] 取第一个元素。想展开数组的每一项,用 .[]:jq .items[] 会逐行输出 "a"、"b"、"c"。
常用组合
和 curl 搭配最常见:
curl -s https://api.example.com/list | jq '.data.items[] | .title'
它取出每一项的 title,-s 让 curl 安静输出。-r 输出不带引号的原始字符串,适合交给下一个命令:jq -r .name 得到 denny。keys 列出对象的所有键,快速了解接口返回了什么:jq 'keys' 得到 ["age", "name"]。length 数个数:jq '.items | length' 得到 3。select 过滤记录:jq '.[] | select(.age > 30)' 只留下年龄大于 30 的那一条。
实战:筛出 error 日志
很多日志是一行一条 JSON,如 {"time":"10:02:10","level":"error","msg":"connect failed"}。一行命令挑出报错:
cat app.log | jq 'select(.level == "error")'
只看时间和信息时,再构造对象:jq 'select(.level == "error") | {time, msg}'。先过滤、再取字段,同样适用于接口返回和测试数据。
提醒:引号与 PowerShell
表达式要用单引号包裹,如 jq '.name'。用双引号时,Shell 会先解释 $、反引号等特殊字符,表达式还没到 jq 手里就变了样。PowerShell 里单引号本身就是字符串定界符,嵌套的 JSON 双引号容易冲突,可改用双引号并转义内部双引号,或先存成文件,用 Get-Content data.json | jq .name 处理。
掌握以上用法,日常看接口、查日志就够用了。
- 点赞
- 收藏
- 关注作者
评论(0)