Bash
組合多個 awk 函式
我對 awk 很陌生,我正在嘗試在不支持
grep -P
也沒有安裝 Perl 的環境中執行以下操作。鑑於我有一個以前綴開頭的 env 變數列表,我想根據這些變數生成一個參數列表,而不使用前綴。
所以,例如,如果我有
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 函式嗎?謝謝
您的程式碼,帶有換行符以提高可讀性
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 等。
最後,
=
用作欄位分隔符以更輕鬆地使用 varname。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 } '