文字列を持っています
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.active
とafter=
を見つけてそのWordを抽出することです。
Wordを使用してサーバー上の他のアイテムを構成するため、これをシェルスクリプトにしたいと思います。
これは可能ですか、可能であれば、どのようにすればよいですか。
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
オプションを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が空かどうかをテストできます。
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
ミックスに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