在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?
答案 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"