web-dev-qa-db-ja.com

grep / sed / awkを使用して文字列からWordを抽出する

文字列を持っています

00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256

そして、-Dspring.profiles.activeに続くWord qaを抽出したい。

デモ用に、文字列をファイルtext.txtに保存しています。

私がする時

grep -r -o "spring.profiles.active=" text.txt

結果はspring.profiles.active=です

この単語は常にqaであるとは限らず、prodまたはdevである可能性があります。

私がやりたいのは、Word spring.profiles.activeafter=を見つけてそのWordを抽出することです。

Wordを使用してサーバー上の他のアイテムを構成するため、これをシェルスクリプトにしたいと思います。

これは可能ですか、可能であれば、どのようにすればよいですか。

12
Gman

PCREでgrepを使用できます(-P):

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active=はこの部分文字列と文字通り一致し、\Kは一致を破棄します

  • [^ ]+は目的の部分、つまりspring.profiles.active=の後の部分を次のスペースまで選択します

ファイルの場合:

grep -Po 'spring.profiles.active=\K[^ ]+' file.txt

例:

% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

sedは同様のロジックを取ります。

sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'

例:

% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

エラー処理:

スクリプトでは、一致しない場合、つまり元の文字列にspring.profiles.active=が含まれていない場合を処理できます。上記のsedの例では、元の文字列全体を取得するため、問題が発生する可能性があります。

% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256

一致しないときに空の文字列を取得したい場合は、-nオプションをsedコマンドに追加し、pオプションをsedsに追加します次のようなコマンド:

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa

次に、$ varが空かどうかをテストできます。

17
heemayl

awkを使用

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'your_string'

または

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' your_file

% awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
1
A.B.

ミックスにPerlを1つ投げます。

<<<'string' Perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l:自動行末処理を有効にします。 2つの別々の効果があります。まず、-nまたは-pと共に使用すると、自動的に$ /(入力レコードの区切り記号)が削除されます。次に、$ \(出力レコードセパレーター)にoctnumの値を割り当てて、printステートメントがそのセパレーターを再び追加するようにします。 octnumが省略された場合、$ \を現在の値$ /に設定します。
  • -a:-nまたは-pとともに使用すると、自動分割モードがオンになります。 @F配列への暗黙的なsplitコマンドは、-nまたは-pによって生成される暗黙的なwhileループ内で最初に実行されます。
  • n:Perlがプログラムの周りに次のループを想定し、sed -nまたはawkのようなファイル名の引数を反復処理します。

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e:プログラムの1行を入力するために使用できます。
% <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256' Perl -lane '$F[3]=~s/.*?=//;print($F[3])'
qa
1
kos