将文本文件中的额外列拆分为单独的行(保留第一列)

时间:2017-03-21 19:25:49

标签: bash shell amazon-web-services ssl

我将尝试尽可能地描述我的问题和最终目标,在这里:

我有一个脚本可以获取AWS ELB信息(elb名称+与特定证书arn关联的端口)。

所以,最后我有一个文本文件(我称之为elb_ports),它看起来像这样:

ccds-lb 636 
cf-router 443 4443 
dev-cf-router 443 4443 
eng-jenkins-monit 443 
gitlab-lb 443 
gitlab-mattermost-elb 443 
jenkins-np-elb 443 
saml 443  
uaa 443 

我之后有另一个脚本,我希望它通过elb_ports文件并用新版本替换证书,但根据Amazon's documentation:它说是为了替换证书,我需要来自elb_ports文件的两件事。负载均衡器名称和负载均衡器端口。

基本上他们的命令看起来像这样

aws elb set-load-balancer-listener-ssl-certificate \
  --load-balancer-name my-load-balancer \
  --load-balancer-port 443 \
  --ssl-certificate-id arn:aws:iam::123456789012:server-certificate/my-new-certificate

我希望能够遍历文件并对每个elb和端口执行上面的命令,但我的问题是elbs有多个与证书关联的端口,例如:cf-router 443 4443。 / p>

所以我的想法是把它分成两行,所以像这样:

cf-router 443
cf-router 4443

但我不确定如何将cf-router(例如)添加到第一个之后的端口(可能有两个以上的端口使用相同的证书)

我希望我能够清楚地解释我的问题和最终目标,如果这不是一个好方法,我也愿意接受建议。

编辑:也许something like this是有益的,但不确定如何根据我的需要定制它。比如将每行放在一个数组中,将空格作为分隔符,然后循环遍历每一行{{1} (负载均衡器名称),然后是负载均衡器端口,但不知道如何计算并通过bash中的arr(1)

1 个答案:

答案 0 :(得分:1)

将额外的列拆分为单独的行:

while read -r lb_name lb_ports_str; do   ## split line into lb name and port list string
  read -r -a lb_ports <<<"$lb_ports_str" ## split out port list string into an array
  for port in "${lb_ports[@]}"; do       ## iterate through that array
    printf '%s %s\n' "$lb_name" "$port"  ## handle each port separately
  done
done <elb_ports                          ## reading lines from elb_ports

当然,printf可以是引用$lb_name$port的任何其他行 - 这意味着您可能会运行在此处安装新证书的代码。