在BASH中读取和循环浏览JSON文件

时间:2018-08-21 06:49:28

标签: json bash jq

我有一个名为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": ""
    }
}

2 个答案:

答案 0 :(得分:3)

这将返回google_groups属性的commercial属性中每个数组中的第二个元素:

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来说明如何使用它,还可以选择使用一个shell变量。另一方面,如果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处理的文件。与使用管道相比,这样做的一个优点是不会创建子外壳。除其他外,这意味着循环中使用的变量在while块之后仍保留在范围内,因此您以后可以使用它们。

如果您想使用管道,只需移除done之后的零件并将命令移至第一行:

jq ... | while read -r email; do # etc.

答案 1 :(得分:0)

正如@TomFenech所指出的那样,要求有些不清楚,但是如果是您想要的电子邮件地址,则可能需要以下答案的变体:

java -cp "somepath/lib/*" mypackage.MainClass