Linux jq 使用

jq 是一个很好用的处理 json 的工具,可以使用它直接在命令行下对 json 进行操作,分片、过滤、映射和转换。

安装

1
2
3
4
5
6
7
8
9
10
11
# ubuntu安装
apt-get update
apt-get install jq

# 编译安装
git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure --disable-maintainer-mode
make
sudo make install

简单使用

格式化输出

test.json 文件的内容:

1
[{"name":"xiaoming","age":"18","address":{"city":"上海","country":"中国"},"contacts":[{"phone":"132156465"}]}]

格式化输出:

1
2
3
cat test.json | jq '.'
# 或者
jq '.' test.json

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[
{
"name":"xiaoming",
"age":"18",
"address":{
"city":"上海",
"country":"中国"
},
"contacts": [
{
"phone":"132156465"
}
]
}
]

访问 json 对象的属性

访问元素的操作: .<attributename>.[index]
jq 支持管道 |,它如同 linux 命令中的管道线——把前面命令的输出当作是后面命令的输入。
如下命令把 .[0] 作为 {...} 的输入,进而访问嵌套的属性,如 .name.address.city

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat test.json | jq '.[0] | {name:.name,city:.address.city}'

# 输出:

{
"name": "xiaoming",
"city": "上海"
}

cat test.json | jq '.[0] | {phone:.contacts[0].phone,city:.address.city}'

#输出:

{
"phone": "132156465",
"city": "上海"
}

修改 json

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
29
30
31
# 修改属性的值,重定向到新的文件
MM_FILE=info.json
MM_AGE=18
get_name() {
return 'xiaoming'
}
jq '.people.address = "shanghai"' $MM_FILE > $MM_FILE.tmp
jq '.people.name = "'$(get_name)'"' $MM_FILE > $MM_FILE.tmp
jq '.people.age = "'${MM_AGE}'"' $MM_FILE > $MM_FILE.tmp

# 输出数组,输出加上`[]`
cat test.json | jq '[.[0] | {name:.name,city:.address.city}]'

# 输出:
[
{
"name": "xiaoming",
"city": "上海"
}
]

# 添加属性
cat test.json | jq '[.[0] | {name_cp:.name,city_cp:.address.city}]'

# 输出:
[
{
"name_cp": "xiaoming",
"city_cp": "上海"
}
]

参考资料