jq: 命令行下的 json 处理工具

jq 是一款命令行的 json 处理工具。相似于 lodash 同样,它能够对 json 作各类各样的处理: pickgetfiltersortmap...git

因为 jq 自己比较简单,如下总结一些常常用到的示例。若是须要更多的细节,能够参考 jq 官方文档github

先建立一个样例 demo.jsonljsonl 即每行都是一个 json,经常使用在日志格式中shell

{"name": "shanyue", "age": 24, "friend": {"name": "shuifeng"}}
{"name": "shuifeng", "age": 25, "friend": {"name": "shanyue"}}
复制代码

因为在后端 API 中会是以 json 的格式返回,再次建立一个样例 demo.jsonjson

[
  {"name": "shanyue", "age": 24, "friend": {"name": "shuifeng"}},
  {"name": "shuifeng", "age": 25, "friend": {"name": "shanyue"}}
]
复制代码

json to jsonl

$ cat demo.json | jq '.[]'
{
  "name": "shanyue",
  "age": 24,
  "friend": {
    "name": "shuifeng"
  }
}
{
  "name": "shuifeng",
  "age": 25,
  "friend": {
    "name": "shanyue"
  }
}
复制代码

jsonl to json

$ 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
}
复制代码
相关文章
相关标签/搜索