문자열의 일부를 일치시키고 전체 문자열을 인쇄합니다.

문자열의 일부를 일치시키고 전체 문자열을 인쇄합니다.

내 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

-nsed 명령은 " 줄의 시작 부분부터 마지막 ​​항목까지 모든 것을 자체적으로 바꿀 수 없으면 아무것도 인쇄하지 마십시오( )"를 의미합니다 . tac-따라서 마지막 항목 이전의 모든 항목을 삭제한 tac-다음 인쇄하면 tac-Trip-test.

sed"탐욕적이지 않은" 일치가 수행되지 않으므로 이는 가능한 가장 긴 문자열이 항상 일치됨을 의미 합니다 .*. 그러나 다른 도구에서는 탐욕스럽지 않은 일치를 수행할 수 있습니다.

  1. 암소 비슷한 일종의 영양grep

    $ echo "$problem_dbs" | grep -oP '(^|\s)\Ktac-\S+'
    tac-nightly-test
    tac-Trip-test
    
  2. 진주

    $ echo "$problem_dbs" | perl -lane 'print join "\n",grep{/^tac-\S+/}@F'
    tac-nightly-test
    tac-Trip-test
    
  3. 다양한 종류

    $ 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

관련 정보