我如何传递“aws iam list-users”的所有输出并引用用户名,以便我可以从“aws iam list-groups-for-user”中提取所有相应的信息?最好是一个漂亮的.tsv文件。
要加入(在SQL意义上)aws iam list-users
返回的表和aws iam list-groups-for-user
的迭代作为制表符分隔的数据,您可以尝试这样的事情:
#!/usr/bin/env bash
aws iam list-users --output text > users.txt
cut -f6 users.txt | while read user ; do
(echo $user ; aws iam list-groups-for-user \
--user-name $user \
--output text) | paste - - >> groups.txt
done
join -1 6 -2 1 users.txt groups.txt
笔记:
--output text
会导致所有AWS CLI命令返回以制表符分隔的数据。因此第一行从users.txt
创建了一个“表”aws iam list-users
。aws iam list-groups-for-user
。paste - -
命令在同一行上“粘贴”前两行文本。这样做的目的是将用户添加到groups.txt
表中的一个字段中,以便我们有一个“加入”字段。join -1 6 -2 1 users.txt groups.txt
就像users.txt
和groups.txt
表上的SQL连接。 -1 6
说使用第一个文件中的第6个字段,-2 1
说使用第二个文件中的第1个字段作为要加入的字段。如果要删除输出中的某些字段,可以修改join命令。你这样做我指定要通过-o
包含的字段列表。例如。
join -o 1.6,1.3,1.4,1.5,2.6,2.3,2.4,2.5,2.7 -1 6 -2 1 users.txt groups.txt
这表示从第一个文件中选择第6个,第3个,第4个,第5个字段,从第二个文件中选择第6个,第3个,第4个,第5个和第7个字段。
这可能会让你开始:
#!/usr/bin/env bash
users=$(aws iam list-users \
--query 'Users[].UserName' \
--output text
)
for user in $users ; do
groups=$(aws iam list-groups-for-user \
--user-name $user \
--query 'Groups[].GroupName' \
--output text \
| paste -s -d, - # join newlines as comma-separated values
)
printf "%s\t%s\n" $user $groups
done