642 字
3 分钟
jq 命令详解及示例
jq 命令详解及示例
jq 是一款命令行的 json 处理工具。类似于 lodash 一样,它可以对 json 做各种各样的处理: pick,get,filter,sort,map…
由于 jq 本身比较简单,以下总结一些经常用到的示例。如果需要更多的细节,可以参考 jq 官方文档
先创建一个样例 demo.jsonl,jsonl 即每行都是一个 json,常用在日志格式中
{"name": "shanyue", "age": 24, "friend": {"name": "shuifeng"}}{"name": "shuifeng", "age": 25, "friend": {"name": "shanyue"}}由于在后端 API 中会是以 json 的格式返回,再次创建一个样例 demo.json
[ {"name": "shanyue", "age": 24, "friend": {"name": "shuifeng"}}, {"name": "shuifeng", "age": 25, "friend": {"name": "shanyue"}}]- 原文链接: jq命令使用及示例 · github
- 系列文章: 当我有台服务器时我做了什么 · github
jq 命令详解
jq 主要可以分作两部分,options 即选项,filter 即各种转换操作,类似于 lodash 的各种函数
jq [options...] filter [files]强烈建议参考 jq 官方手册,命令示例一应俱全
option
我仅常用以下几个选项
-s: 把读取的jsonl视作数组来处理 (如 group, sort 只能以数组作为输入)-c: 不对输出的json做格式化,一行输出
filter
filter 各种转换操作就很多了,如 get,map,filter,map,pick,uniq,group 等操作
.: 代表自身.a.b: 相当于_.get(input, 'a.b')select(bool): 相当于_.filter(boolFn)map_values: 相当于_.map,不过jq无法单独操作keysortgroup_by
更多 filter 参考 jq 官方手册
jq examples
虽然 jq 的功能很强大,但平时使用最为频繁的也就以下几个示例。当然复杂的情形也会有,参考我过去一篇使用 jq 改 ts 类型错误的一篇文章: sequelize 升级记录
json to jsonl
$ cat demo.json | jq '.[]'{ "name": "shanyue", "age": 24, "friend": { "name": "shuifeng" }}{ "name": "shuifeng", "age": 25, "friend": { "name": "shanyue" }}jsonl to json
# -s: 代表把 jsonl 组成数组处理$ cat demo.jsonl | jq -s '.'[ { "name": "shanyue", "age": 24, "friend": { "name": "shuifeng" } }, { "name": "shuifeng", "age": 25, "friend": { "name": "shanyue" } }]. (_.get)
$ cat demo.jsonl | jq '.name'"shanyue""shuifeng"{} (_.pick)
$ cat demo.jsonl| jq '{name, friendname: .friend.name}'{ "name": "shanyue", "friendname": "shuifeng"}{ "name": "shuifeng", "friendname": "shanyue"}select (_.filter)
$ cat demo.jsonl| jq 'select(.age > 24) | {name}'{ "name": "shuifeng"}map_values (_.map)
$ cat demo.jsonl| jq '{age} | map_values(.+10)'{ "age": 34}{ "age": 35}sort_by (_.sortBy)
sort_by 需要先把 jsonl 转化为 json 才能进行
# 按照 age 降序排列# -s: jsonl to json# -.age: 降序# .[]: json to jsonl# {}: pick$ cat demo.jsonl | jq -s '. | sort_by(-.age) | .[] | {name, age}'{ "name": "shuifeng", "age": 25}{ "name": "shanyue", "age": 24}
# 按照 age 升序排列$ cat demo.jsonl | jq -s '. | sort_by(.age) | .[] | {name, age}'{ "name": "shanyue", "age": 24}{ "name": "shuifeng", "age": 25}