# jq 命令详解及示例
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命令使用及示例 (opens new window) · github (opens new window)
- 系列文章: 当我有台服务器时我做了什么 (opens new window) · github (opens new window)
# jq 命令详解
jq 主要可以分作两部分,options 即选项,filter 即各种转换操作,类似于 lodash 的各种函数
jq [options...] filter [files]
强烈建议参考 jq 官方手册 (opens new window),命令示例一应俱全
# 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 官方手册 (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"
}
# 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
}