从bash脚本变量中解析一个字符串的json

时间:2016-11-28 15:45:27

标签: bash

在bash中,我从mongo查询中得到了一个json响应:

...
json=`echo $con`
echo $json

结果如下所示:

{ "_id" : "579289cc0", "externalId" : "2911", "externalTenantGUID" : "29d3928e53b", "name" :["X", "Y"] ... }{ "_id" : "5792892323", "externalId" : "291e31", "externalTenantGUID" : "29d3928e3253b", "name" :["X", "Y"] ... }{ "_id" : "57923320", "externalId" : "293211", "externalTenantGUID" : "29d3928322e53b", "name" :["X", "Y"] ... }

这里我要解析这个响应$ con并且只获取映射到“_id”的值,如579289cc0,5792922323,57923320。我尝试使用sed和awk但没有成功(对于manny条件),有没有更简单的方法没有安装python?

3 个答案:

答案 0 :(得分:1)

使用jq:

$ jq '._id' infile
"579289cc0"
"5792892323"
"57923320"

或者,如果您不想在结果周围使用引号,请使用-r作为“原始输出”:

$ jq -r '._id' infile
579289cc0
5792892323
57923320

如果您的JSON数据位于变量而不是文件中,则可以使用here string

$ jq -r '._id' <<< "$json"
579289cc0
5792892323
57923320

答案 1 :(得分:0)

做那样的事

   <?php

$con = '{  "products":[
                        {
                            "_id": "579289cc0",
                            "externalId": "2911",
                            "externalTenantGUID": "29d3928e53b"
                        }, {
                            "_id": "5792892323",
                            "externalId": "291e31",
                            "externalTenantGUID": "29d3928e3253b"
                        }, {
                            "_id": "57923320",
                            "externalId": "293211",
                            "externalTenantGUID": "29d3928322e53b"
                        }
                    ]
        }';
echo $con;
$JSON_OBG = json_decode($con, true);

// print_r($JSON_OBG);

$Results = '';
foreach($JSON_OBG['products'] as $OBG)
{
 $Results .=  $OBG['_id'].',';
}
$Results = rtrim($Results,',');
echo  $Results ;
?>

答案 2 :(得分:0)

使用perl regEx语法,可以按如下方式完成。虽然这是实现用例的一种hacky方式,但建议使用jq来修复损坏的json字符串并提取这些标识符。现在你可以做到,

perl -lne 'print "$1" if /.*\"_id\" : \"([[:alnum:]]+)\".*/' file
579289cc0
5792892323
57923320

此外,您可以在启用PCRE时使用grep,即使用-P标志进行Perl样式正则表达式匹配。

grep -Po "\"_id\" :\K \"([[:alnum:]]+)\"" <<<"$json"
"579289cc0"
"5792892323"
"57923320"