私の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
-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