Linux之jq
Linux之jq
jq
简介
jq可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样,都可以让你轻松地把玩文本。它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的更加简短。
jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;在linux系统中也可以直接用yum安装。
安装
Mac
1 | brew install jq |
Linux
1 | yum install jq |
查看命令使用
1 | man jq |
json文档
1 | { |
使用
使用jq将文件内容格式化为json
1
cat book.json | jq
基本过滤
.
- 最简单的过滤,
.
这是一个过滤器,它接受输入,并将其不变地生成为输出。
1
cat book.json | jq '.'
- 最简单的过滤,
获取book下所有的书籍
1
cat book.json | jq .store.book
对象过滤
.key
、.key1.key2
、.["key"]
- 可以通过
.key
或.key1.key2
的方式来获取对应的value
,这样的方式是不是有点像jsonpath
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29jingdeMacBook-Pro:~ apple$ cat book.json | jq '.store.book'
[
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
]- 可以通过
索引过滤
.key[index]
、.key[ startIndex: endIndex]
- 其实就是在
对象过滤
的基础上加个索引
而已,学过编程的都懂的~左闭右开
,当然是针对数组的操纵,这里就以一种对象过滤写法基础上举例子, - .key[index]
1
2
3
4
5
6
7jingdeMacBook-Pro:~ apple$ cat book.json | jq '.store.book[0]'
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
}- .key[ startIndex: endIndex]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15jingdeMacBook-Pro:~ apple$ cat book.json | jq '.store.book[0: 2]'
[
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
]- .key[-index]
1
2
3
4
5
6
7
8jingdeMacBook-Pro:~ apple$ cat book.json | jq .store.book[-1]
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}- 其实就是在
对象构建
{}
、[]
- 可以利用
{}
、[]
构建新的对象(数组)
- 修改key的值
1
2
3
4jingdeMacBook-Pro:~ apple$ cat book.json | jq '{ Java: .store.book[0].title}'
{
"Java": "Sayings of the Century"
}- 如果其中一个表达式有多个结果,那么输出也会产生多个结果
1
2
3
4
5
6
7
8
9jingdeMacBook-Pro:~ apple$ echo '{"user":"Jack", "titles":["Java", "Python"]}' | jq '{user, title:.titles[]}'
{
"user": "Jack",
"title": "Java"
}
{
"user": "Jack",
"title": "Python"
}- 如果
key
是不存在的,value
将会赋值为null
1
2
3
4
5
6
7
8
9jingdeMacBook-Pro:~ apple$ echo '{"user":"Jack", "titles":["Java", "Python"]}' | jq '{user1, title:.titles[]}'
{
"user1": null,
"title": "Java"
}
{
"user1": null,
"title": "Python"
}- 如果再键的周围加括号就意味着它将作为表达式进行计算
1
2
3
4
5
6
7jingdeMacBook-Pro:~ apple$ echo '{"user":"Jack", "titles":["Java", "Python"]}' | jq '{(.user):.titles[]}'
{
"Jack": "Java"
}
{
"Jack": "Python"
}- 可以利用
计算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17jingdeMacBook-Pro:~ apple$ echo "10" | jq '(.+2)*5'
60
jingdeMacBook-Pro:~ apple$ echo null | jq '{a: 1} + {b: 2} + {c: 3} + {a: 42}'
{
"a": 42,
"b": 2,
"c": 3
}
jingdeMacBook-Pro:~ apple$ echo '["xml", "yaml", "json"]' | jq '. - ["xml"]'
[
"yaml",
"json"
]
jingdeMacBook-Pro:~ apple$ echo '{"a":5}' | jq '.a+=10'
{
"a": 15
}获取长度
1
2
3
4
5jingdeMacBook-Pro:~ apple$ echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length'
2
6
1
0数组运算
并集('+')
:有数组a
,b
;a+b
就会得到一个包含所有a
,b
数组元素的新数组:
1
2
3
4
5
6
7
8
9jingdeMacBook-Pro:~ apple$ echo '{"a":[1,2,3],"b":[3,4,5]}' | jq '.a+.b'
[
1,
2,
3,
3,
4,
5
]
差集('-')
:有数组a
,b
;a-b
就会得到一个只包含a
中元素,不包含b
中元素的新数组:1
2
3
4
5
6
7
8
9
10jingdeMacBook-Pro:~ apple$ echo '{"a":[1,2,3],"b":[3,4,5]}' | jq '.a-.b'
[
1,
2
]
jingdeMacBook-Pro:~ apple$ echo '{"a":[1,2,3],"b":[3,4,5]}' | jq '.b-.a'
[
4,
5
]
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jing's Blog!