내 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
'tac-*'로 시작하는 문자열을 검색하고 인쇄하고 싶습니다.
tac-nightly-test
tac-Trip-test
나는 시도했다:
echo $problem_dbs | sed -n -e 's/^.*\(tac-\)/\1/p'
하지만 인쇄만 됩니다tac-Trip-test
내가 뭐 놓친 거 없니?
답변1
귀하의 awk 버전이 줄 바꿈 없이 입력을 지원하는 경우(내가 아는 한) 필요한 것은 다음과 같습니다.
printf '%s' "$problem_dbs" | awk -v RS=' ' '/^tac-/'
tac-nightly-test
tac-Trip-test
그렇지 않으면 다중 문자 RS
합계 에 GNU awk를 사용하십시오 \s
.
awk -v RS='\\s' '/^tac-/'
또는 임의의 awk를 사용합니다(질문에서와 같이 한 줄 입력이 있고 tac-
한 줄 끝에 문자열이 포함된 여러 줄 입력이 없고 다음 줄 시작 부분에 즉시 다시 입력되지 않는다고 가정).
awk -v RS=' ' '{sub(/\n/,"")} /^tac-/'
답변2
-n
sed 명령은 " 줄의 시작 부분부터 마지막 항목까지 모든 것을 자체적으로 바꿀 수 없으면 아무것도 인쇄하지 마십시오( )"를 의미합니다 . tac-
따라서 마지막 항목 이전의 모든 항목을 삭제한 tac-
다음 인쇄하면 tac-Trip-test
.
sed
"탐욕적이지 않은" 일치가 수행되지 않으므로 이는 가능한 가장 긴 문자열이 항상 일치됨을 의미 합니다 .*
. 그러나 다른 도구에서는 탐욕스럽지 않은 일치를 수행할 수 있습니다.
암소 비슷한 일종의 영양
grep
$ echo "$problem_dbs" | grep -oP '(^|\s)\Ktac-\S+' tac-nightly-test tac-Trip-test
진주
$ echo "$problem_dbs" | perl -lane 'print join "\n",grep{/^tac-\S+/}@F' tac-nightly-test tac-Trip-test
다양한 종류
$ echo "$problem_dbs" | tr ' ' '\n' | grep '^tac-' tac-nightly-test tac-Trip-test
답변3
그리고 awk
:
$ echo "$problem_dbs" | awk '
{for(i=1;i<=NF;i++)
if ($i ~ /^tac-/)
print $(i)
}'
tac-nightly-test
tac-Trip-test