在Shell
中处理复杂的JSON
数据,一般有以下三种方式:
jq
:jq是一款强大的JSON处理工具,支持过滤、修改、重组和生成JSON数据。Python
:使用Python来处理复杂的JSON数据。结合了Shell脚本的便利性和Python处理JSON的强大能力grep/sed/awk
:在无其他工具的情况下使用grep/sed/awk等(不推荐)
一、基于 jq
处理 JSON
如果未安装jq,会提示如下错误
-bash: jq: command not found
安装jq
# 官方源中目前没有包含jq,因此需要首先安装epel
yum -y install epel-release
# 安装jq
yum -y install jq
示例数据:JSON文件data.json
{
"user": {
"name": "Alice",
"age": 30,
"contacts": [
{"type": "email", "value": "[email protected]"},
{"type": "phone", "value": "123-456-7890"}
]
}
}
- 加载并将整个JSON内容以格式化的方式输出
cat data.json | jq '.'
- 取某个特定的值:name
cat data.json | jq '.user.name'
# 输出 "Alice"
处理数组
- 获取所有联系人信息,输出每个联系人的信息
cat data.json | jq '.user.contacts[]'
- 获取所有联系人的值
cat data.json | jq '.user.contacts[].value'
过滤数据
- 使用select函数来过滤数据:获取所有电子邮件地址
cat data.json | jq '.user.contacts[] | select(.type == "email") | .value'
嵌套数据结构的修改、合并
- 添加一个新的联系人
cat data.json | jq '.user.contacts += [{"type": "fax", "value": "098-765-4321"}]'
- 将添加一个新的联系人后的JSON保存到文件
cat data.json | jq '.user.contacts += [{"type": "fax", "value": "098-765-4321"}]' > new_data.json
二、基于Python来处理Json
可以直接在Shell脚本
中使用Python
的-c
选项执行一段Python
代码来处理JSON
数据(示例数据同上)
- 取某个特定的值:name
cat data.json | python -c 'import json,sys; data=json.load(sys.stdin); print(data["user"]["name"])'
- 提取第一个联系人的类型
python -c 'import json,sys; data=json.load(sys.stdin); print(data["user"]["contacts"][0]["type"])' < data.json
- 提取所有联系人的值
python3 -c 'import json,sys; data=json.load(sys.stdin); print([c["value"] for c in data["user"]["contacts"]])' < data.json
将Python代码写入Shell脚本
将Python代码放入一个Shell脚本中,作为脚本的一部分。可以使用Python的全部功能来处理JSON数据
#!/bin/bash
json_file="data.json"
name=$(python3 -c "
import json
with open('$json_file') as f:
data = json.load(f)
print(data['user']['name'])
")
echo "Name: $name"
contacts=$(python3 -c "
import json
with open('$json_file') as f:
data = json.load(f)
contacts = [c['value'] for c in data['user']['contacts']]
print(', '.join(contacts))
")
echo "Contacts: $contacts"
三、使用grep、sed、awk、cut 处理Json
这种方式在处理嵌套结构和复杂的数据时会变得非常繁琐且容易出错。
- 取某个特定的值:name
grep '"name":' data.json | sed 's/.*"name": "\(.*\)",/\1/'
- 提取所有联系人的值(前提:JSON结构及顺序固定)
grep -o '"value": "[^"]*"' data.json | sed 's/"value": "\(.*\)"/\1/'
使用awk处理JSON
- 提取age字段
awk -F': ' '/"age"/ {print $2}' data.json | tr -d ','
标签:Shell,contacts,处理,JSON,json,jq,Json,user,data
From: https://blog.csdn.net/promise524/article/details/141039471