组合多个 awk 函数

组合多个 awk 函数

我对 awk 很陌生,我试图在不支持grep -P也没有安装 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

字符串操作了解更多。

相关内容