我有一个名为department_groups.json的JSON文件(见下文)。
本质上,如果我给出一个commercial的参数,我希望它能返回:
commercial-team@domain.com
commercial-updates@domain.com有人能指导/帮助我做到这一点吗?
{
"legal": {
"google_groups":[
["Legal", "legal@domain.com"],
["Legal Team", "legal-team@domain.com"],
["Compliance Checks", "compliance@domain.com"]
],
"samba_groups": ""
},
"commercial":{
"google_groups":[
["Commercial Team", "commercial-team@domain.com"],
["Commercial Updates", "commercial-updates@domain.com"]
],
"samba_groups": ""
},
"technology":{
"google_groups":[
["Technology", "technology@domain.com"],
["Incidents", "incidents@domain.com"]
],
"samba_groups": ""
}
}发布于 2018-08-21 15:10:41
这将返回commercial属性的google_groups属性中每个数组中的第二个元素:
jq --arg key commercial '.[$key].google_groups | .[] | .[1]' file使用jq -r以“原始”格式输出(去掉双引号)。
$ key=commercial
$ jq -r --arg key "$key" '.[$key].google_groups | .[] | .[1]' file
commercial-team@domain.com
commercial-updates@domain.com我在这些示例中使用了--arg,以展示它是如何使用的,也可以与外壳变量一起使用。另一方面,如果commercial只是一个固定的字符串,那么您可以简化:
jq -r '.commercial.google_groups | .[] | .[1]' file要处理输出的每一行,只需使用外壳while read循环:
key=commercial
while read -r email; do
echo "$email"
# process each email individually here
done < <(jq -r --arg key "$key" '.[$key].google_groups | .[] | .[1]' file)在这里,我使用了一个进程替换<(),它的作用类似于一个可由shell处理的文件。与使用管道相比,这样做的一个优点是不会创建子subshell。其中,这意味着循环中使用的变量在while块之后仍在作用域内,因此您可以在以后使用它们。
如果您更喜欢使用管道,只需删除done之后的零件,并将命令上移到第一行:
jq ... | while read -r email; do # etc.发布于 2018-08-21 23:23:28
正如@TomFenech指出的那样,要求有点不清楚,但如果是你想要的电子邮件地址,他的答案的以下变体可能会引起兴趣:
key=commercial
$ jq -r --arg key "$key" '.[$key].google_groups[][] | select(test("@"))' department_groups.json
commercial-team@domain.com
commercial-updates@domain.comhttps://stackoverflow.com/questions/51943101
复制相似问题