文字列の一部を一致させ、文字列全体を印刷します。

文字列の一部を一致させ、文字列全体を印刷します。

私の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を使用します(質問のように1行の入力があり、tac-1行の末尾に文字列を含む複数行の入力がなく、次の行の先頭にすぐに再入力されないと仮定します)。

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

関連情報