使用 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 的 shell 脚本中的变量中。

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

不要将命令存储在 shell 变量中然后对它们进行求值,这样会使您自己编码变得更加困难并引入安全问题。使用函数代替,例如(未经测试):

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

相关内容