在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
data.json
{
"user": {
"name": "Alice",
"age": 30,
"contacts": [
{"type": "email", "value": "[email protected]"},
{"type": "phone", "value": "123-456-7890"}
]
}
}
cat data.json | jq '.'
cat data.json | jq '.user.name'
# 输出 "Alice"
cat data.json | jq '.user.contacts[]'
cat data.json | jq '.user.contacts[].value'
cat data.json | jq '.user.contacts[] | select(.type == "email") | .value'
cat data.json | jq '.user.contacts += [{"type": "fax", "value": "098-765-4321"}]'
cat data.json | jq '.user.contacts += [{"type": "fax", "value": "098-765-4321"}]' > new_data.json
可以直接在Shell脚本
中使用Python
的-c
选项执行一段Python
代码来处理JSON
数据(示例数据同上)
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的全部功能来处理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 '"name":' data.json | sed 's/.*"name": "\(.*\)",/\1/'
grep -o '"value": "[^"]*"' data.json | sed 's/"value": "\(.*\)"/\1/'
awk -F': ' '/"age"/ {print $2}' data.json | tr -d ','