jq 是一款命令行的 json 处理工具。类似于 lodash 一样,它可以对 json 做各种各样的处理: pick,get,filter,sort,map…
由于 jq 本身比较简单,以下总结一些经常用到的示例。如果需要更多的细节,可以参考 jq 官方文档(opens new window)
先创建一个样例 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 命令详解
jq 主要可以分作两部分,options 即选项,filter 即各种转换操作,类似于 lodash 的各种函数
jq [options...] filter [files]
强烈建议参考 jq 官方手册 (opens new window),命令示例一应俱全
option
我仅常用以下几个选项
-s: 把读取的jsonl视作数组来处理 (如 group, sort 只能以数组作为输入)-
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 官方手册(opens new window)
jq examples
虽然 jq 的功能很强大,但平时使用最为频繁的也就以下几个示例。当然复杂的情形也会有,参考我过去一篇使用 jq 改 ts 类型错误的一篇文章: sequelize 升级记录(opens new window)
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"}
mapvalues (.map)
$ cat demo.jsonl| jq '{age} | map_values(.+10)'{"age": 34}{"age": 35}
sortby (.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}
