在JSON中搜索键值并从其他键打印值

时间:2018-09-21 06:07:20

标签: 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}' 

,但这会打印键值,该值将出现在匹配键的后续行中。我需要找到匹配键之前的值。

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} '