awk - 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),因为我无法真正使用可用的构建代理。
任何帮助将非常感激!
解决方案
考虑使用 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”以从结果数组中去除尾随的新行
推荐阅读
- microsoft-graph-api - Outlook 消息属性(标志、IsRead)和删除状态的同步
- c# - 为什么 sql_variant 数据类型只返回字符串?在 SQL-Server 和 VS# 调试器中?
- google-apps-script - Timestamp is generated when cell is not empty. If blank, timestamp is cleared
- django - TestCase 中的 Django Client.get() 从 django.utils.cache 返回 TypeError
- java - sql server 上的 ExecutorService 多线程
- dart - Server response with output from Future Object
- javascript - How to manage asynchronous properly
- python - Keras that does not support TensorFlow 2.0. We recommend using `tf.keras`, or alternatively, downgrading to TensorFlow 1.14
- react-native - 如何在 routeConfig 中访问 redux 存储(react-navigation)
- java - 如何在worklight 8.0 android中使用WLResourceRequest