{
"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'
参考
https://stackoverflow.com/a/21595107/432903
解决方法:
如果您使用:
$cat members.json | \
python -c 'import json,sys;obj=json.load(sys.stdin);print obj;'
你可以检查嵌套的dictonary obj的结构,看看你的原始行应该是:
$cat members.json | \
python -c 'import json,sys;obj=json.load(sys.stdin);print obj["hits"]["hits"][0]["_source"]["'$1'"]';
to the“memberId”元素.这样您就可以将Python保持为oneliner.
如果嵌套的“hits”元素中有多个元素,那么您可以执行以下操作:
$cat members.json | \
python -c '
import json, sys
obj=json.load(sys.stdin)
for y in [x["_source"]["'$1'"] for x in obj["hits"]["hits"]]:
print y
'
Chris Down的解决方案更适合在任何级别查找单个值到(唯一)键.
在我的第二个打印多个值的示例中,您正在达到应该尝试使用单行程的限制,此时我看不出为什么要在bash中执行一半处理,并且将转向完整的Python解决方案.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。