如何使用 grep 或任何其他实用程序根据条件从结构化数据中获取字符串?

How can I use grep or any other utility to get a string from a structured data based on a condition?

Name                 State           Dns
DeltaService         running         DeltaService.test.qa.domain.com
DeltaService_1       stopped   
DeltaService_2       stopped         DeltaService_2.test.qa.domain.com
UnitedService        running         UnitedService.test.qa.domain.com
UnitedService_1      stopped         
UnitedService_2      running         UnitedService_2.test.qa.domain.com

以上数据在执行期间显示为我的日志的一部分。 我想要做的是在日志中搜索具有相似名称且具有 DNS 的服务,并使用 bash 脚本将它们存储在数组中。例如,如果我想要 DeltaService,我希望能够检索 "DeltaService"""=18=]" 并存储在数组中我可以在其中使用这些服务名称进行进一步处理。我怎样才能做到这一点? 我尝试过的:

#"${serviceLogs[@]}" = contains the structured data.

print -- '%s\n' "${serviceLogs[@]}" | grep -oh "\w*DeltaService\w*"

output:
DeltaService
DeltaService_1
DeltaService_2

#I don't need DeltaService_1 because it has no DNS.

awk 似乎是正确的工具:

printf -- '%s\n' "${serviceLogs[@]}" |
awk ' ~ /^DeltaService/ &&  != "" {print }'
DeltaService
DeltaService_2

根据 OP 的评论:

serviceLogs='Name                 State           Dns
DeltaService         running         DeltaService.test.qa.domain.com
DeltaService_1       stopped   
DeltaService_2       stopped         DeltaService_2.test.qa.domain.com
UnitedService        running         UnitedService.test.qa.domain.com
UnitedService_1      stopped         
UnitedService_2      running         UnitedService_2.test.qa.domain.com'

使用awk解析数据的一个想法:

$ awk -v ptn="DeltaService" '~ptn &&  {print }' <<< "${serviceLogs}"
DeltaService
DeltaService_2

将结果存储在名为 services[]:

bash 数组中
$ services=( $(awk -v ptn="DeltaService" '~ptn &&  {print }' <<< "${serviceLogs}") )
$ typeset -p services
declare -a services=([0]="DeltaService" [1]="DeltaService_2")