【问题标题】:Search for key value in JSON and print value from different key在 JSON 中搜索键值并打印来自不同键的值
【发布时间】:2018-09-21 06:07:19
【问题描述】:

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

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

【问题讨论】:

  • 你为什么使用awk进行JSON解析?使用 jq - 轻量级 JSON 解析器
  • 这将是 jenkins 构建过程的一部分。我们可以在 jenkins 中实现 jq 吗?
  • 是的,您可以在您的节点中安装jq
  • github.com/arakelian/java-jq 是否与此处相关?

标签: bash jq


【解决方案1】:

使用jq

jq '.data[] | select(.name == "dev") | .id' file

如果您想要原始数据(不带引号),请使用 -r 选项。

【讨论】:

  • 感谢您的回复。我知道 jq 可以完成这项工作。但是在我的 jenkins 服务器中设置 jq 时我有一些限制。有什么方法可以使用 awk/sed/grep/etc 在 bash 脚本中实现它会很棒。再次感谢。
  • @W-awk/sed/grep/etc 不是 JSON 解析器。您不应使用它们来执行此类任务。如果无法使用jq,请使用 perl/python/etc 等高级语言并依赖其 JSON 库。
  • gawk 有一个解析 JSON 的扩展。见link
【解决方案2】:

在合理的假设下,您可能会逃脱以下或非常类似的事情:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2015-06-07
    相关资源
    最近更新 更多