如何使用脚本从带有空字符串的日志中解析列

时间:2021-02-07 20:51:45

标签: bash gcloud

假设一个日志结果包括几个用通配符分隔的列。对于某些列,如 PREEMPTIBLE、EXTERNAL_IP,有时它们有值,有时它们没有。请参阅下面的示例。在这种情况下,如何获取 INTERNAL_IP 等其他列?

run: gcloud compute instances list  --project=XXX, get:
NAME  ZONE  MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS                                       
Name1  zone1  type1       true        5.6.7.8     1.2.3.4     RUNNING
Name2  zone1  type1       true        6.5.8.7                 RUNNING
Name3  zone2  type2                   6.5.8.7                 RUNNING

事实上,如果所有列都非空,那么我可以使用以下方法获取 INTERNAL_IP:

gcloud compute instances list  --project=XXX |tr -s ' ' |awk -F' ' '{if (NR>1)print $5}'

因为 INTERNAL_IP 是第 5 列,或者

gcloud compute instances list  --project=XXX |tr -s ' ' |awk -F' ' '{if (NR>1)print $(NF-2)}' 

因为 INTERNAL_IP 是最后一列的第三个

但是如果像 PREEMPTIBLE 和 EXTERNAL_IP 这样的列有空字符串,或者有时它们是完全空的,那么很难解析像 INTERNAL_IP 这样的列,因为对于某些行 INTERNAL_IP 是第 5 列,对于某些行 INTERNAL_IP 是第 4 列,等

那么,在这种情况下如何获得 INTERNAL_IP?谢谢。

1 个答案:

答案 0 :(得分:2)

您可以在第一行获取 INTERNAL_IP 的索引,并在以下几行使用它来访问内部 ip:

gcloud compute instances list  --project=XXX |\
awk 'NR==1{ii=index($0,"INTERNAL_IP")}NR>1{$0=substr($0,ii);sub(" +.*","");print}'