首页 > 解决方案 > bash / grep:从 json 中获取多个匹配元素

问题描述

在我的 BitBucket+Bamboo 设置中,我试图获取有权访问特定存储库的人员的电子邮件地址列表。这是 BitBucket API 的输出:

{
    "size": 3,
    "limit": 25,
    "isLastPage": true,
    "values": [
        {
            "user": {
                "name": "name1",
                "emailAddress": "name1.lastname1@domain.com",
                "id": 1,
                "displayName": "Name1 Lastname1",
                "active": true,
                "slug": "name1",
                "type": "NORMAL",
                "links": {
                    "self": [
                        {
                            "href": "https://bitbucket.com/stash/users/name1"
                        }
                    ]
                }
            },
            "permission": "REPO_WRITE"
        },
        {
            "user": {
                "name": "name2",
                "emailAddress": "name2.lastname2@domain.com",
                "id": 2,
                "displayName": "Name2 Lastname2",
                "active": true,
                "slug": "name2",
                "type": "NORMAL",
                "links": {
                    "self": [
                        {
                            "href": "https://bitbucket.com/stash/users/name2"
                        }
                    ]
                }
            },
            "permission": "REPO_WRITE"
        },
        {
            "user": {
                "name": "name3",
                "emailAddress": "name3.lastname3@domain.com",
                "id": 3,
                "displayName": "Name3 Lastname3",
                "active": true,
                "slug": "name3",
                "type": "NORMAL",
                "links": {
                    "self": [
                        {
                            "href": "https://bitbucket.com/stash/users/name3"
                        }
                    ]
                }
            },
            "permission": "REPO_WRITE"
        }
    ],
    "start": 0
}

有没有一种简单的方法可以将所有 3 个电子邮件地址放入 bash 脚本中的数组或逗号分隔的变量中?我尝试使用 grep 并以某种方式拆分 API 输出(例如通过“权限”),但到目前为止没有运气。请注意,我可能被迫使用 grep、sed 或 awk 之类的标准工具,这意味着我可能无法使用 jq 之类的工具(在 bash 中处理 json),因为我无法真正使用可用的构建代理。

任何帮助将非常感激!

标签: awksedgrep

解决方案


考虑使用 JQ(或其他 JSON 查询工具)。它将处理任何有效的 Json,即使是没有以特定方式打印或格式化的 Json。可以与 readarray 结合以在 bash 中构建数组。

readarray -t emails <<< "$(jq -r '.values[].user.emailAddress' < file)"

将产生一个数组“电子邮件”

declare -p emails
declare -a emails=([0]=$'name1.lastname1@domain.com' [1]=$'name2.lastname2@domain.com' [2]=$'name3.lastname3@domain.com')

注释 2020-07-22:添加了“-t”以从结果数组中去除尾随的新行


推荐阅读