假设我有一个包含此JSON的文件:
[
{
"label" : "deploy",
"pk" : 2388175,
"key" : "gsfd45"
},
{
"label" : "jenkins",
"key" : "eQtIAwP",
"pk" : 2388165
}
]
如果它位于具有label =“deploy”的哈希值中,我想获取键“pk”的值。
我该怎么做?我需要写一个脚本吗?
答案 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
。
将行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 yourfile
和RS
也应该与awk一起使用。