我有以下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}'
但这会打印出键值,该值出现在匹配键的后续行中。我需要找到匹配键之前的值。
使用jq
:
jq '.data[] | select(.name == "dev") | .id' file
如果需要原始数据(不带引号(,请使用-r
选项。
在合理的假设下,您可能会侥幸逃脱以下情况,或者非常类似的事情:
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} '