如何使用 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")
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")