Shell脚本如何解析JSON格式输出

wen 实用脚本 1

本文目录导读:

Shell脚本如何解析JSON格式输出

  1. 使用 jq (推荐)
  2. 使用Python
  3. 使用awk(简单场景)
  4. 完整脚本示例
  5. jq 常用操作示例
  6. 推荐使用策略

在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 '.'

推荐使用策略

  1. 首选jq - 功能最全,性能最好
  2. 备选Python - 大部分系统都预装
  3. 避免正则解析 - JSON结构复杂时容易出错

选择哪种方法取决于你的具体需求和环境限制。

抱歉,评论功能暂时关闭!