匹配字符串的一部分并打印整个字符串

jam*_*mes 3 sed awk

我的 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

我错过了什么吗?

Ed *_*ton 5

如果您的 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)