匹配JSON文本中的键值模式并获取另一个键的值

时间:2017-01-03 13:39:52

标签: json bash macos

假设我有一个包含此JSON的文件:

[
   {
      "label" : "deploy",
      "pk" : 2388175,
      "key" : "gsfd45"
   },
   {
      "label" : "jenkins",
      "key" : "eQtIAwP",
      "pk" : 2388165
   }
]

如果它位于具有label =“deploy”的哈希值中,我想获取键“pk”的值。

我该怎么做?我需要写一个脚本吗?

4 个答案:

答案 0 :(得分:4)

要在Bash中解析JSON,请使用jq

$ jq '.[] | select(.label=="deploy").pk' file
2388175

如果要将deploy存储在变量中,请使用--arg。来自jq manual → Invoking jq

  

- arg名称值

     

此选项将值作为预定义变量传递给jq程序。如果你使用--arg foo bar运行jq,那么$ foo在程序中可用并且值为" bar"。请注意,值将被视为字符串,因此--arg foo 123会将$ foo绑定到" 123"。

$ v="deploy"
$ jq --arg var "$v" '.[] | select(.label==$var).pk' file
2388175

$ v="blabla"
$ jq --arg var "$v" '.[] | select(.label==$var).pk' file
            # empty!

$ v="jenkins"
$ jq --arg var "$v" '.[] | select(.label==$var).pk' file
2388165

分段:

打印所有内容:

$ jq '.[]' file
{
  "key": "gsfd45",
  "pk": 2388175,
  "label": "deploy"
}
{
  "pk": 2388165,
  "key": "eQtIAwP",
  "label": "jenkins"
}

打印label等于"部署":

的记录
$ jq '.[] | select(.label=="deploy")' file
{
  "key": "gsfd45",
  "pk": 2388175,
  "label": "deploy"
}

在这种情况下只打印字段pk

$ jq '.[] | select(.label=="deploy").pk' file
2388175

答案 1 :(得分:1)

如果服务器上没有jq,那么python应该在那里,对吗? ^ _ *

#!/bin/python
import json
with open('data.json') as data_file:    
    data = json.load(data_file)
    for d in data:
        if d['label'] == 'deploy':
            print(d["pk"])

假设您的文件名为data.json,请将其另存为id.py,然后运行:

python id.py

您的系统上需要安装python3

如果您只安装了python2,请

将行print (d["pk"])更改为print d["pk"]

输出结果为:

2388175

修改

添加了if支票,没有注意到OP想检查label

答案 2 :(得分:1)

在awk中。它有点不完整,但由于你没有任何东西可以显示,你可以在这个上面工作:

$ awk -F: '$1~/"label"/{l=$2} l~/deploy/ && $1 ~ /pk/ {sub(/,/,"",$2);print $2}' file
 2388175

当awk遇到"label"的记录时,它会存储$2。找到pk并且标记l中包含deploy后,请删除逗号并打印。

答案 3 :(得分:0)

如果James Brown提供的优雅解决方案不起作用(例如,键/值对的不同排序),则尝试将大括号之间的字符串至少设置为一个记录(通过设置 MongoCredential credential1 = MongoCredential.createCredential("admin", db1, "password"); MongoCredential credential2 = MongoCredential.createCredential("admin1", db2, "password1"); MongoClient mongoClient = new MongoClient(new ServerAddress(), Arrays.asList(credential1, credential2)); ),然后使用键“pk”(通过设置RS)将键字符串拆分为键值对。

在该设置之后,模式在$ 0中查找标签/部署键/值对,然后,仅当存在两个字段(例如,存在pk并且发生字段拆分)时,$ 2中的逗号之后的字符串是删除并且密钥pk的值保留并打印:

<强> script.awk

FS

您可以将此脚本与awk一起使用:BEGIN { RS="[{}[\\]]" FS="\"pk\"[^:]*:" } /"label"[^:]*:[^\"]*"deploy"/ { if( NF == 2 ) { # "pk" is present in $0, remove everything after comma sub(/,.*/, "", $2) print $2 } }

我只使用GNU awk尝试过,但awk -f script.awk yourfileRS也应该与awk一起使用。