本文目录导读:

在Shell脚本中解析JSON有多种方法,这里介绍几种常用的方式:
使用 jq (推荐)
jq 是专门用于处理JSON的命令行工具,功能最强大。
安装jq
# Ubuntu/Debian sudo apt-get install jq # CentOS/RHEL sudo yum install jq # macOS brew install jq
基本用法示例
# 示例JSON数据
json='{"name": "Alice", "age": 30, "city": "Beijing"}'
# 解析单个字段
echo "$json" | jq -r '.name'
# 输出: Alice
# 解析嵌套对象
json='{"user": {"name": "Bob", "age": 25}}'
echo "$json" | jq -r '.user.name'
# 输出: Bob
# 解析数组
json='{"users": [{"name": "Alice"}, {"name": "Bob"}]}'
echo "$json" | jq -r '.users[0].name'
# 输出: Alice
# 遍历数组
echo "$json" | jq -r '.users[].name'
# 输出: Alice Bob
使用Python
#!/bin/bash
# 方法1: 使用python3
json='{"name": "Alice", "age": 30}'
name=$(python3 -c "import json,sys; print(json.loads('$json')['name'])")
echo $name
# 方法2: 处理文件
echo '{"name": "Alice"}' > data.json
python3 -c "import json; print(json.load(open('data.json'))['name'])"
# 方法3: 处理curl输出
curl -s https://api.example.com/user | python3 -c "
import json,sys
data = json.load(sys.stdin)
print(data['name'])
"
使用awk(简单场景)
#!/bin/bash
# 仅适用于简单格式的JSON
json='{"name": "Alice", "age": 30}'
echo "$json" | awk -F'"' '/"name":/{print $4}'
完整脚本示例
#!/bin/bash
# 从API获取JSON并解析
get_user_info() {
local user_id=$1
# 模拟API请求
local response='{
"status": "success",
"data": {
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"roles": ["admin", "user"]
}
}'
# 检查是否有jq
if command -v jq &> /dev/null; then
# 使用jq解析
echo "用户名: $(echo $response | jq -r '.data.name')"
echo "邮箱: $(echo $response | jq -r '.data.email')"
echo "角色: $(echo $response | jq -r '.data.roles[]')"
else
# 使用python作为备选
echo "$response" | python3 -c "
import json,sys
data = json.load(sys.stdin)
if data['status'] == 'success':
user = data['data']
print(f\"用户名: {user['name']}\")
print(f\"邮箱: {user['email']}\")
print(\"角色: \" + ', '.join(user['roles']))
"
fi
}
# 调用函数
get_user_info 1
jq 常用操作示例
#!/bin/bash
# 示例数据
json='{
"users": [
{"name": "Alice", "age": 30, "city": "Beijing"},
{"name": "Bob", "age": 25, "city": "Shanghai"},
{"name": "Charlie", "age": 35, "city": "Beijing"}
]
}'
echo "所有用户:"
echo "$json" | jq -r '.users[].name'
echo "年龄大于30的用户:"
echo "$json" | jq -r '.users[] | select(.age > 30) | .name'
echo "北京的用户的年龄:"
echo "$json" | jq -r '.users[] | select(.city == "Beijing") | "\(.name): \(.age)"'
echo "统计:"
echo "$json" | jq -r '.users | length'
echo "格式化输出:"
echo "$json" | jq '.'
推荐使用策略
- 首选jq - 功能最全,性能最好
- 备选Python - 大部分系统都预装
- 避免正则解析 - JSON结构复杂时容易出错
选择哪种方法取决于你的具体需求和环境限制。