如何使用 shell 脚本在 csv 文件的列开头插入值

How to insert value at start of column in csv file using shell script

我有以下代码来获取 API 数据并将其存储在 csv 文件中:

for projectid in `gcloud scc assets list <someorgID>
   --filter="security_center_properties.resource_type=\"google.cloud.resourcemanager.Project\""
   -- format="get(asset["securityCenterProperties"]["resourceDisplayName"])"`
   
   do
       gcloud recommender recommendations list \
       --location=global \
       --recommender=google.iam.policy.Recommender \
       --project=$projectid \
       --format="csv[no-heading](content["overview"], content["operationGroups"])" >> temp_iam.csv  done

这将得到如下结果:

cloudresourcemanager.googleapis.com,    remove
cloudresourcemanager.googleapis.com,    add

我想将 $projectid 的值添加到第一位为:

projectid1, cloudresourcemanager.googleapis.com, remove
projectid2, cloudresourcemanager.googleapis.com, add

我怎样才能做到这一点?

你可以要求awk插入循环变量;这里有一个简化的循环来演示:

for projectid in projectid1 projectid2
do
  gcloud ... | awk -v project="$projectid" '{ =project ", " ; print;}'
done

这会将 gcloud ... 的输出通过管道传递给 awk; awk 被赋予一个名为“project”的变量,该变量被设置为循环变量 $projectid 的值。然后在 awk 的每一行输入(gcloud 的输出)中,我们用 project 变量、命令和 space 的串联替换第一个字段,然后是第一个字段的值——本质上是在projectid 值作为 CSV 输出的新第一个值。

新脚本为:

for projectid in `gcloud scc assets list <someorgID>
   --filter="security_center_properties.resource_type=\"google.cloud.resourcemanager.Project\""
   -- format="get(asset["securityCenterProperties"]["resourceDisplayName"])"`
   do
       gcloud recommender recommendations list \
       --location=global \
       --recommender=google.iam.policy.Recommender \
       --project=$projectid \
       --format="csv[no-heading](content["overview"], content["operationGroups"])" | \
       awk -v project="$projectid" '{ =project ", " ; print;}' >> temp_iam.csv
   done

GCP API 在响应中包含 resource name,因此该响应的一部分包含项目编号。

具体来说,gcloud recommender recommendations list调用了Recommender API, which responds with a Recommendation resourceprojects.locations.recommenders.recommendations.list方法,并且被gcloud工具接收到,也就是说我们已经有了项目响应。

要了解如何正确打印该信息,我们可以查看 gcloud topic projections,我们可以看到一些适用于此处的转换。

如果您对项目编号感兴趣,可以select名称资源的第二段(索引1)进行推荐:

gcloud recommender recommendations list --format="value(name.segment(1))" --location=global --recommender=google.iam.policy.Recommender  

要将其包含在当前打印 CSV 的命令中,您可以使用:

gcloud recommender recommendations list \
  --location=global \
  --recommender=google.iam.policy.Recommender \
  --project=$projectid \
  --format="csv[no-heading](name.segment(1),content["overview"], content["operationGroups"])" >> temp_iam.csv