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处理。
参考文档: