Bash

組合多個 awk 函式

  • April 29, 2021

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

引用自:https://unix.stackexchange.com/questions/647288