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

답변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

바라보다문자열 연산더 알아보기.

관련 정보