grep -P
私は最初にawkに触れていて、Perlがサポートされていてもインストールされていない環境で次のことをやろうとしています。
プレフィックスで始まる環境変数のリストがある場合は、プレフィックスを使用せずにこれらの変数に基づいてパラメータリストを生成したいと思います。
たとえば、私が持っている場合
PREFIX_VARIABLE_1=100
PREFIX_VARIABLE_2=500
作成したい
--set service.VARIABLE_1=100 --set service.VARIABLE_2=500
私はそれを知っています
env | awk 'match($0, /PREFIX_.*/) { substr($0, RSTART+8, RLENGTH) ; split($0, parts, "=") ; printf "--set service.%s=%s ", parts[1], parts[2] }'
substr
しかし、それは未使用のプレフィックスを削除しません。
それでgrep -P
私はできる:
env | grep -oP '(?<=PREFIX_)(.*)' | awk 'split($0, parts, "=") { printf "--set service.%s=%s ", parts[1], parts[2] }'
複数のawk関数を正しく接続/パイプする方法を知っていますか?ありがとう
答え1
読みやすくするために改行を含むコード
env | awk '
match($0, /PREFIX_.*/) {
substr($0, RSTART+8, RLENGTH)
split($0, parts, "=")
printf "--set service.%s=%s ", parts[1], parts[2]
}
'
substr
素晴らしい作品。戻り値に対して何もしませんでした。 substr自体は$ 0を変更しません。
PREFIX_VAR=something
まず、正規表現をより具体的に作成し、代わりに見つけることを提案します。some_other_var=$PREFIX_VAR
これでPREFIXが何であるかがわかったので、RSTARTなどを使用する必要はないと提案します。
=
最後に、変数名の操作を容易にするためにフィールド区切り文字として使用されます。
env | awk -F= '$1 ~ /^PREFIX_/ {printf "--set service.%s=%s ", substr($1,8), $2}'
このコードは、あなたのコードと同様に、等号を含む変数の値を正しく処理しません。 awkで2..NFフィールドをリンクするのは少し面倒です。
env | awk '
function join (fstart, fend, separator, i, result) {
for (i = fstart; i <= fend; i++)
result = result $i (i == fend ? "" : separator)
return result
}
$1 ~ /^PREFIX_/ {
var = substr($1, 8)
value = join(2, NF, "=")
printf "--set service.%s=%s ", var value
}
'
答え2
cat file
代わりに、次のコマンドを使用してくださいenv
。
$ cat file | awk 'sub(/^PREFIX_/,"--set service."){out=out sep $0; sep=OFS} END{print out}'
--set service.VARIABLE_1=100 --set service.VARIABLE_2=500
答え3
これは、どちらかを使用せずに行うことができますawk
。ただ別の方法を見せてください
while read -r env
do
[[ $env == *PREFIX_* ]] && envs+=("--set service.${env#*_}")
done < <(env)
printf '%s ' "${envs[@]}"
したがって、ここでは各行を読み取り、をPREFIX_
使用して配列変数に追加します+=
。以下を確認してください${env#*_}
。
PREFIX_VARIABLE_1=100
~になる
VARIABLE_1=100
バラより文字列演算もっと学ぶ。