我对 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
看字符串操作了解更多。