bash – 使用Python解析JSON?

我有一个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'

参考

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解决方案.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...