jq
是一款命令行的 json
處理工具。相似於 lodash
同樣,它能夠對 json
作各類各樣的處理: pick
,get
,filter
,sort
,map
...git
因爲 jq
自己比較簡單,如下總結一些常常用到的示例。若是須要更多的細節,能夠參考 jq 官方文檔github
先建立一個樣例 demo.jsonl
,jsonl
即每行都是一個 json
,經常使用在日誌格式中shell
{"name": "shanyue", "age": 24, "friend": {"name": "shuifeng"}}
{"name": "shuifeng", "age": 25, "friend": {"name": "shanyue"}}
複製代碼
因爲在後端 API 中會是以 json
的格式返回,再次建立一個樣例 demo.json
json
[
{"name": "shanyue", "age": 24, "friend": {"name": "shuifeng"}},
{"name": "shuifeng", "age": 25, "friend": {"name": "shanyue"}}
]
複製代碼
$ cat demo.json | jq '.[]'
{
"name": "shanyue",
"age": 24,
"friend": {
"name": "shuifeng"
}
}
{
"name": "shuifeng",
"age": 25,
"friend": {
"name": "shanyue"
}
}
複製代碼
$ cat demo.jsonl | jq -s '.'
[
{
"name": "shanyue",
"age": 24,
"friend": {
"name": "shuifeng"
}
},
{
"name": "shuifeng",
"age": 25,
"friend": {
"name": "shanyue"
}
}
]
複製代碼
$ cat demo.jsonl | jq '.name'
"shanyue"
"shuifeng"
複製代碼
$ cat demo.jsonl| jq '{name, friendname: .friend.name}'
{
"name": "shanyue",
"friendname": "shuifeng"
}
{
"name": "shuifeng",
"friendname": "shanyue"
}
複製代碼
$ cat demo.jsonl| jq 'select(.age > 24) | {name}'
{
"name": "shuifeng"
}
複製代碼
$ cat demo.jsonl| jq '{age} | map_values(.+10)'
{
"age": 34
}
{
"age": 35
}
複製代碼
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
}
複製代碼