在 JSON 中搜索键值,并从不同的键中打印值

  • 本文关键字:打印 搜索 JSON 键值 bash jq
  • 更新时间 :
  • 英文 :


我有以下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} '

最新更新