我有一个JSON文件members.json
,如下所示。
{
"took": 670,
"timed_out": false,
"_shards": {
"total": 8,
"successful": 8,
"failed": 0
},
"hits": {
"total": 74,
"max_score": 1,
"hits": [
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcf",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
},
{
"_index": "2000_270_0",
"_type": "Medical",
"_id": "02:17447847049147026174478:174159",
"_score": 1,
"_source": {
"memberId": "0x7b93910446f91928e23e1043dfdf5bcG",
"memberFirstName": "Uri",
"memberMiddleName": "Prayag",
"memberLastName": "Dubofsky"
}
}
]
}
}
我想使用bash
脚本来解析它,仅获取字段列表memberId
。
预期的输出是:
memberIds
-----------
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG
我尝试将以下bash + python代码添加到.bashrc
:
function getJsonVal() {
if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then
echo "Usage: getJsonVal 'key' < /tmp/file";
echo " -- or -- ";
echo " cat /tmp/input | getJsonVal 'key'";
return;
fi;
cat | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["'$1'"]';
}
然后调用:
$ cat members.json | getJsonVal "memberId"
但是它抛出:
Traceback (most recent call last):
File "<string>", line 1, in <module>
KeyError: 'memberId'
参考
2
为什么您需要使用bash进行此操作?您显然在这里使用python,为什么不创建一个可以完成此任务的python脚本呢?您可能无法获得有关如何使用bash的实际答案,因为当您需要做很多事情时,您会使用另一种语言。
—
DavidG 2014年
我将标题从“使用bash脚本”更改为“使用python”,因为
—
goldilocks 2014年
python
而不是bash
解析JSON时使用的标题。例如,该错误肯定是python错误,而不是bash错误。
@goldilocks仅仅是因为他尝试过
—
jordanm 2014年
python
,并不意味着他的目标是使用python
@DavidG看到我的答案。它不是纯shell,它是一个外部命令,但是可以很好地集成到shell脚本中。
—
jordanm 2014年
我可以建议您删除json中大多数不相关的字段吗?_source中包含2-3个元素足以了解您尝试执行的操作。其余的只是分散注意力
—
Anthon 2014年