我的 Ubuntu 系统上的命令打印以下输出,我将输出保存到变量 $problem_dbs 中:
tacservices/e43ccb05-5b0a-4403-950b-9c91ed3f3694 unresponsive agent z1 10.213.197.77 tac-nightly-test tacservices/54be8202-2304-462e-8574-1aef379160d9 failing z1 10.213.204.228 tac-Trip-test
Run Code Online (Sandbox Code Playgroud)
我想搜索并打印以“tac-*”开头的字符串:
tac-nightly-test
tac-Trip-test
Run Code Online (Sandbox Code Playgroud)
我试过了:
echo $problem_dbs | sed -n -e 's/^.*\(tac-\)/\1/p'
Run Code Online (Sandbox Code Playgroud)
但它只打印tac-Trip-test
我错过了什么吗?
如果您的 awk 版本支持没有终止换行符的输入(据我所知都是如此),那么您需要的是:
printf '%s' "$problem_dbs" | awk -v RS=' ' '/^tac-/'
tac-nightly-test
tac-Trip-test
Run Code Online (Sandbox Code Playgroud)
否则,使用 GNU awk 进行多字符RS
和\s
:
awk -v RS='\\s' '/^tac-/'
Run Code Online (Sandbox Code Playgroud)
或使用任何 awk (假设您有单行输入,如问题中所示,并且永远不会tac-
在一行末尾有一个字符串的多行输入,然后立即在下一行的开头再次输入):
awk -v RS=' ' '{sub(/\n/,"")} /^tac-/'
Run Code Online (Sandbox Code Playgroud)