首页 > 解决方案 > bash 文本处理以删除 ascii 并从结果中获取唯一行

问题描述

在linux中,下面的命令

terraform providers

输出结果如下

.
├── provider[xxx.com/edu/xxxvenafi] 1.2.0
├── provider[registry.terraform.io/hashicorp/kubernetes] 2.3.2
├── provider[xxx.com/edu/xxxsmaas] 1.0.1
├── provider[registry.terraform.io/hashicorp/aws]
├── module.standard_deployment
│   ├── provider[xxx.com/edu/xxxsmaas] 1.0.1
│   ├── provider[xxx.com/edu/xxxvenafi] 1.2.0
│   ├── provider[registry.terraform.io/hashicorp/kubernetes]
│   └── provider[registry.terraform.io/hashicorp/local]
└── module.standand_ingress
    ├── provider[registry.terraform.io/hashicorp/kubernetes]
    ├── provider[xxx.com/edu/xxxsmaas] 1.0.1
    ├── provider[xxx.com/edu/xxxvenafi] 1.2.0
    └── provider[registry.terraform.io/hashicorp/aws]

Providers required by state:

    provider[xxx.com/edu/xxxsmaas]

    provider[xxx.com/edu/xxxvenafi]

    provider[registry.terraform.io/hashicorp/aws]

    provider[registry.terraform.io/hashicorp/kubernetes]

从输出中删除这些树结构的最佳方法是什么?最终目标是仅列出以下唯一行,

provider[xxx.com/edu/xxxvenafi] 1.2.0    
provider[xxx.com/edu/xxxsmaas] 1.0.1

标签: bashawksedcut

解决方案


使用sedand sort,你可以试试这个

$ sed -E 's/.*(provider.*)/\1/g;/^[a-z]/!d' input_file | sort -u
provider[registry.terraform.io/hashicorp/aws]
provider[registry.terraform.io/hashicorp/kubernetes]
provider[registry.terraform.io/hashicorp/kubernetes] 2.3.2
provider[registry.terraform.io/hashicorp/local]
provider[xxx.com/edu/xxxsmaas] 1.0.1
provider[xxx.com/edu/xxxvenafi] 1.2.0

然而,这可能不是最有效的。

编辑

取自 Hai Vu 的评论,这里有一个适用于 OP 的 grep 替代方案。

terraform providers | grep -o 'provider.*[0-9][^]]*$' | sort -u

推荐阅读