Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
update dcc302b Nov 17, 2019
1 contributor

Users who have contributed to this file

190 lines (150 sloc) 4.18 KB
title keywords description date sidebarDepth tags
jq 命令详解及示例
jq,json命令行工具,jq examples,json格式化工具
jq 是一款命令行的 json 处理工具。类似于 lodash 一样,它可以对 json 做各种各样的处理,如 pick,get,filter,sort,map
2019-10-24 08:00
3
linux

jq 命令详解及示例

jq 是一款命令行的 json 处理工具。类似于 lodash 一样,它可以对 json 做各种各样的处理: pickgetfiltersortmap...

由于 jq 本身比较简单,以下总结一些经常用到的示例。如果需要更多的细节,可以参考 jq 官方文档

先创建一个样例 demo.jsonljsonl 即每行都是一个 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 官方手册,命令示例一应俱全

option

我仅常用以下几个选项

  • -s: 把读取的 jsonl 视作数组来处理 (如 group, sort 只能以数组作为输入)
  • -c: 不对输出的 json 做格式化,一行输出

filter

filter 各种转换操作就很多了,如 getmapfiltermappickuniqgroup 等操作

  • .: 代表自身
  • .a.b: 相当于 _.get(input, 'a.b')
  • select(bool): 相当于 _.filter(boolFn)
  • map_values: 相当于 _.map,不过 jq 无法单独操作 key
  • sort
  • group_by

更多 filter 参考 jq 官方手册

jq examples

虽然 jq 的功能很强大,但平时使用最为频繁的也就以下几个示例。当然复杂的情形也会有,参考我过去一篇使用 jqts 类型错误的一篇文章: 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
}
You can’t perform that action at this time.