awk를 사용하여 리터럴 백슬래시 교체

awk를 사용하여 리터럴 백슬래시 교체

다음을 반환하는 aws 명령이 있습니다.

{
    "Parameter": {
        "Name": "/mysite/development/mongodb_uri",
        "Type": "SecureString",
        "Value": "mongodb+srv://administrator:[email protected]/mysite_development?retryWrites=true&w=majority",
        "Version": 4
    }
}

awk로 파이프하고 & 기호를 이스케이프 처리하고 싶습니다.

aws | awk '/Value/ { gsub(/[\",\"]/,\"\",\$2); gsub(/[\"&\"]/,\"\\\\&\",\$2); print \$2}'

결과는 다음과 같습니다.

mongodb+srv://administrator:[email protected]/mysite_development?retryWrites=true&w=majority

그러나 & 기호는 이스케이프되지 않습니다. 결과 문자열에 "\&"가 나타날 것으로 예상됩니다. 이 awk 명령은 eval에 전달된 쉘 스크립트의 변수에 저장됩니다.

AWS_COMMAND="aws ssm --region us-east-2 --with-decryption get-parameter --name"
AWK_COMMAND="awk '/Value/ { gsub(/[\",\"]/,\"\",\$2); gsub(/[\"&\"]/,\"\\\\&\",\$2); print \$2}'"

FETCH_AWS_SSM () {
  eval "$AWS_COMMAND /$APPLICATION/$DEPLOYMENT_GROUP_NAME/$1 | $AWK_COMMAND"
}

MONGODB_URI=$(FETCH_AWS_SSM "mongodb_uri")
echo MONGODB_URI

이 문자 그대로의 백슬래시를 어떻게 얻을 수 있나요?

답변1

JSON을 사용하는 경우 이를 위해 특별히 설계된 도구를 사용하세요.jq:

$ aws | jq -r '.Parameter.Value | gsub("&";"\\&")' 
mongodb+srv://administrator:[email protected]/mysite_development?retryWrites=true\&w=majority

답변2

명령을 쉘 변수에 저장한 다음 평가하지 마십시오. 이렇게 하면 직접 코딩하기가 더 어려워지고 보안 문제가 발생합니다. 예를 들어 (테스트되지 않음) 다음과 같은 함수를 대신 사용하십시오.

AWS_COMMAND() {
    aws ssm --region us-east-2 --with-decryption get-parameter --name "$@"
}

AWK_COMMAND() {
    awk '/Value/ { gsub(/[,"]/,"",$2); gsub(/&/,"\\\\&",$2); print $2 }'
}

FETCH_AWS_SSM() {
    AWS_COMMAND "/$APPLICATION/$DEPLOYMENT_GROUP_NAME/$1" | AWK_COMMAND
}

MONGODB_URI=$(FETCH_AWS_SSM 'mongodb_uri')
printf '%s\n' "$MONGODB_URI"

그러나 모든 함수 이름과 내보내지 않은 변수 이름을 소문자로 변경하십시오(스크립트 간의 기능적 차이점을 강조하기 위해 그냥 두었습니다).https://stackoverflow.com/questions/673055/ Correct-bash-and-shell-script-variable-capitalization

관련 정보