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


12

文字列を持っています

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

そしてqa続く単語を抽出したい-Dspring.profiles.active

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

私がする時

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

結果は spring.profiles.active=

この言葉は、常にされていないqa、それは可能性がありproddev

私は何をしたいのは、単語を見つけることですspring.profiles.activeし、=の抽出物、その単語。

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

これは可能ですか?もし可能なら、どうすればいいですか?


これについてはすでにメタ会話が行われていると思いますが、この質問はUbuntuに完全に固有のものではありません。unix.stackexchange.comの代わりにここにあるのは なぜですか?
トニーアダムス

@TonyAdamsはい、テキスト処理の質問はここで間接的に扱われています。とにかく事実上、それらは常にトピックと見なされ、閉じられたり移行されたりすることはありません。Ubuntu固有の点については、これは複数回取り上げられていますが、ここでは最近2回、複製で1回、ここでは1回です
コス

良い質問!:D
ncomputers

回答:


18

grepPCRE(-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するオプションsed sのように、コマンドを実行します。

% 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が空かどうかをテストできます。


@heemayに感謝、完璧に動作します。今、それをスクリプト化するだけです。回答
済み

@heemayは、私がこれをどのようにスクリプト化できるか知っていますか。私はスクリプトにそれを持ち、それを実行するとqaを返します。結果をenvと呼ばれる変数に保存し、それを何かと比較したいと思います。If [env == qa]; それから//何かを...他に何かを
...-Gman

1
うん@Gman ..ちょうどコマンド置換を使用します。var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"交換するfile.txt<<<'...string...'入力が文字列ではなく、あなたが行うことができますfile..thenある場合if [ "$var" = 'qa' ]; then do something; else do something; fi
heemayl

1

を使用して 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

ミックスにPerlを投げます:

<<<'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

:orginal正規表現は次のようにも使用することができますperl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
マンウェ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.