前言

看到公司大佬用命令行操作 JSON,着实很秀,想起自己操作 JSON 要么用在线文档,要么用本地工具,非常之 low。

一个真实案例:有一个比较大的 JSON 数组(大概是这个格式:[{..},{..}..]),我和大佬要查数组内所有字典的相同 key 下是否存在重复的 value,然后我还在思考怎么做效率比较高,大佬已经查完了,只用了大概几秒钟的时间。接着他给我发了一张截图,我看到截图上的 jq 命令,脑袋里全是问号?jq 是啥?貌似没一点印象?确实没印象!于是开始了解 jq 命令行工具,这里简单记录下,非常感谢大佬打破菜鸡的认知水平。

  • 首先 Mac 命令行安装 jq 工具:
1
brew install jq
安装过程稍微有点慢,如果这个时候有报错,大概率是本地环境问题。
  • 安装完之后,准备好一个 JSON 文件,或者直接命令行创建也可以:
1
echo '[{"name": "张三","sex": true},{"name": "李四","sex": true},{"name": "王五","sex": true},{"name": "赵六","sex": true},{"name": "孙七","sex":false}]' > ./test.json

使用方法

  • 查看创建的 JSON:
1
2
3
4
// 表达式 ".",不改变输入,可以将其优美地输出
cat ./test.json | jq .
// 紧凑型输出
cat ./test.json | jq -c .

jq

  • 其它的一些用法:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 属性列表
cat ./test.json | jq '.[] | .name'
// 计数
cat ./test.json | jq '.[] | .name' | wc -l
// 去重计数
cat ./test.json | jq '.[] | .name' | uniq | wc -l
// 条件查询
cat ./test.json | jq '.[] | select(.sex == true)'
// 根据索引取第一个元素
cat ./test.json | jq '.[0]'
| 是管道线的意思,把前面命令的输出当作是后面命令的输入。如上第一个属性列表命令把 .[] 作为输入,进而访问嵌套的属性 .name,打印结果见下图:

jq


总结

jq 是一个效率很高的 JSON 处理工具,使用起来也非常简单方便,我这里只简单记录下常用的功能,一般的 JSON 处理需求之后都可以使用 jq。

今日心得:jq 只是一个缩影,要学习的东西还非常多,加油吧少年!

参考博客