如何使用Bash将多条gcloud查询结果导出到单个CSV文件的不同工作表
首先明确核心前提:CSV是纯文本格式的单表文件,本身不支持多工作表存储,所以你要求的「单个CSV文件内的相邻工作表」是无法直接实现的,只能调整为输出单个支持多工作表的表格文件(比如XLSX格式),或者退而求其次把三类数据合并到单张CSV表中通过标识列区分,具体实现方案如下:
方案1:用Python脚本实现(推荐,支持自动化、可自定义规则)
该方案可以直接并行执行查询并输出带3个工作表的单个XLSX文件,无需生成中间临时文件。
- 先安装依赖库:
pip install pandas openpyxl
- 运行以下Python脚本即可:
import subprocess import pandas as pd from io import StringIO # 按「工作表名, gcloud命令」格式配置你的查询规则 task_config = [ ("项目级用户", 'gcloud projects get-iam-policy MyProject --format="csv(bindings.members)"'), ("文件夹级用户", 'gcloud resource-manager folders get-iam-policy MyFolder --format="csv(bindings.members)"'), ("组织级用户", 'gcloud organizations get-iam-policy MyOrg --format="csv(bindings.members)"') ] with pd.ExcelWriter('iam权限汇总.xlsx') as excel_writer: for sheet_name, cmd in task_config: # 执行gcloud命令捕获输出 run_result = subprocess.run(cmd, shell=True, capture_output=True, text=True, check=True) # 解析CSV格式的命令输出,写入对应工作表 data_df = pd.read_csv(StringIO(run_result.stdout)) data_df.to_excel(excel_writer, sheet_name=sheet_name, index=False)
方案2:纯Linux命令行实现(适合轻量临时使用)
借助ssconvert命令行工具(GNOME Office套件自带,可通过apt install gnumeric安装)实现多CSV合并为多工作表XLSX:
- 先并行执行3条gcloud查询生成临时CSV:
# 后台并行执行3条命令,全部跑完再往下走 gcloud projects get-iam-policy MyProject --format="csv(bindings.members)" > 项目用户.csv & gcloud resource-manager folders get-iam-policy MyFolder --format="csv(bindings.members)" > 文件夹用户.csv & gcloud organizations get-iam-policy MyOrg --format="csv(bindings.members)" > 组织用户.csv & wait
- 合并为单个带多工作表的XLSX文件:
ssconvert --merge-to=iam权限汇总.xlsx 项目用户.csv 文件夹用户.csv 组织用户.csv
方案3:合并为单张CSV(坚持用CSV格式的可选方案)
如果一定要输出CSV格式文件,可以在数据前加一列标识区分资源类型,所有数据放在同一张表:
{ # 先写入表头 echo "资源类型,成员账号" # 查询项目级用户,加标识前缀 gcloud projects get-iam-policy MyProject --format="csv[no-heading](bindings.members)" | sed 's/^/项目,/' # 查询文件夹级用户,加标识前缀 gcloud resource-manager folders get-iam-policy MyFolder --format="csv[no-heading](bindings.members)" | sed 's/^/文件夹,/' # 查询组织级用户,加标识前缀 gcloud organizations get-iam-policy MyOrg --format="csv[no-heading](bindings.members)" | sed 's/^/组织,/' } > iam权限汇总.csv
内容的提问来源于stack exchange,提问作者NewKidOnTheBlock
相关产品推荐
相关产品推荐

