Shell脚本解析JASON数据

JASON 语言简介

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持 JSON
  • JSON 具有自我描述性,更易理解

详细参考:jason数据格式

Shell脚本解析JASON数据

使用jq解析JASON数据

jq 是一个小型跨平台解决方案,用于以更短、更简单、更轻松的方式管理 JSON 数据。安装jq

1
sudo pacman -S jq
  1. jq . 命令美化 json 数据。
1
curl "https://jsonplaceholder.typicode.com/posts" | jq .

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
},
{
"userId": 1,
"id": 2,
"title": "quis ut nam facilis et officia qui",
"completed": false
},
{
"userId": 1,
"id": 3,
"title": "fugiat veniam minus",
"completed": false
}
... // remaining list of data
]
  1. 从 JSON 获取特定字段的值

我们可以使用 jq.[].field_name 从 JSON 数据数组中获取任何特定字段的值。

1
curl "https://jsonplaceholder.typicode.com/posts" | jq '.[].id'

输出:

1
2
3
4
1
2
3
...
  1. 从 JSON 中获取第一个项目的标题
1
curl "https://jsonplaceholder.typicode.com/posts" | jq '.[0].title'

输出:

1
"delectus aut autem"

使用grep解析JSON

grep 命令也可用于解析 JSON 数据。

示例 JSON 文件:

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"id": 1,
"name": "Andres Gustov",
"email": "andddy7@gmail.com"
},
{
"id": 2,
"name": "Anthony Marklov",
"email": "antman33@gmail.com"
}
]

示例脚本:

1
grep -o '"email": "[^"]*' examplejsonfile.json | grep -o '[^"]*$'

我们使用 -o 选项仅选择与给定模式匹配的行。然后,我们指定模式'"email": "[^"]*',这意味着我们想要键 email 的所有值。之后,我们传递 JSON 文件来查找模式。最后,我们使用另一个 grep -o 命令将结果通过管道输出,以删除除值之外的所有内容。

输出:

1
2
andddy7@gmail.com 
antman33@gmail.com

使用python3解析JSON

我们还可以使用 python 的 json 模块来处理 JSON 操作。

1
curl -s 'https://jsonplaceholder.typicode.com/posts' | \ python3 -c "import sys, json; print(json.load(sys.stdin))"

获取特定字段值

1
2
curl "https://jsonplaceholder.typicode.com/posts" | \ 
python3 -c "import sys, json; data=json.load(sys.stdin); print([d['id'] for d in data])"

输出:

1
2
3
4
1
2
3
...

获取第一个项目的标题

1
2
curl "https://jsonplaceholder.typicode.com/posts" | \ 
python3 -c "import sys, json; print(json.load(sys.stdin)[0]['title'])"

输出:

1
"delectus aut autem"