我有以下JSON文件:
{
"data":[
{
"id":"34c4s5f7-175f-480a-adff-d8d0bef4e8c4",
"name":"test",
"organizationId":"7er337a-714c-4043-90b1-6a4e7we82d87",
"isProduction":false,
"type":"test",
"clientId":"6d4720062eab494c45ewedaa78de1"
},
{
"id":"4856a92-9e46-4430-aac7-6ed8674569f",
"name":"dev",
"organizationId":"7er337a-714c-4043-90b1-6a4e7we82d87",
"isProduction":false,
"type":"sandbox",
"clientId":"bs34dea7749494daa8deert908bcd9"
}
],
"total":2
}
我的要求是找到键名称为dev
的记录,然后打印id键。
我碰到了
awk -F: '$1~/"name"/{l=$2} l~/dev/ && $1 ~ /id/ {sub(/,/,"",$2);print $2}'
,但这会打印键值,该值将出现在匹配键的后续行中。我需要找到匹配键之前的值。
答案 0 :(得分:2)
使用jq
:
jq '.data[] | select(.name == "dev") | .id' file
如果要原始数据(不带引号),请使用-r
选项。
答案 1 :(得分:0)
在合理的假设下,您可能会避免以下或类似的事情:
awk '
function check() {
if (flag && id) {
sub(".[^:]*:\"","",id); sub(/.,$/,"",id);
print id; flag=id="";
}
}
$1 ~ /},?/ { check(); next; }
/^ *"id":/ { id=$0; next; }
/^ *"name":"dev"/ {flag=1} '