複数のawk関数の組み合わせ

複数のawk関数の組み合わせ

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

おすすめ記事