jq使用


jq是一个命令行处理json的工具。

现在大部分交互的数据格式都是以json的形式,不管是写一些监控脚本或者平时使用,都是一个比较方便的工具,本文总结下一些基本用法,包括格式化数据,过滤,排序等常用功能。

安装使用

 yum install -y epel-release
 yum install -y jq

格式化输出

默认pretty输出,如果需要压缩,使用-c选项。

$ cat jqtest.json
{"username":"henry","age":25,"email":"xxx@gmail.com","blog":"http://thoreauz.com","hobby":["music","writing","photography"],"education":{"school":"MIT","degree":"Master"}}

cat jqtest.json |jq .

{
  "username": "henry",
  "age": 25,
  "email": "xxx@gmail.com",
  "blog": "http://thoreauz.com",
  "hobby": [
    "music",
    "writing",
    "photography"
  ],
  "education": {
    "school": "MIT",
    "degree": "Master"
  }
}

过滤

使用.foo,选择对象的foo字段,.foo?和前者一样,但出错时不输出出错信息。
cat jqtest.json |jq .email

"xxx@gmail.com"

数组
cat jqtest.json |jq .hobby[1]

$ cat jqtest.json |jq .hobby[1]
"writing"

数据分片

$ cat jqtest.json |jq .hobby[:2]
[
  "music",
  "writing"
]

数组遍历

$ echo "{\"a\": 1, \"b\": 2}"|jq '.[]'
1
2
echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[] | .name'
"JSON"
"XML"

前面的示例严格说是获取特定字段,如果想做更细致的过滤可以使用select函数。

$ cat jqtest.json | jq -r '.education | select(.school == "MIT")'
{
  "school": "MIT",
  "degree": "Master"
}

除了字符串比较,还可以做数字大小比较等

构造新对象

重新组合自己想要的json:

$ cat jqtest.json | jq '.|{"name": .username, "like": .hobby[1]}'
{
  "name": "henry",
  "like": "writing"
}

高级用法

map函数

$ echo "[1,2,3,4]"| jq  'map(select(.>2))' -c
[3,4]

$ echo "[1,2,3,4]"| jq  'map(. + 1)' -c
[2,3,4,5]

Reduce函数

$ echo '[0,1,2,3,4,5,6,7,8,9]' | jq 'reduce .[] as $n ([]; if ($n%2==0) then . else . + [$n] end)' -c
[1,3,5,7,9]

从示例中看到了很多用法,reduce遍历,定义变量$n,可以使用if-elif-else-end,添加数据+[]。

总之,他就像awk一样是个小型的编程语言,可以自定义函数,具有I/O和Stream,几乎能实现自己想要的任何json处理。


参考文档:
* https://stedolan.github.io/jq/manual/
* https://jqplay.org/

CONTENTS