首页 > 解决方案 > Shell 脚本 - 在 awk 命令中正确引用

问题描述

我有一个带有 2 个参数和一个条件的 awk 命令 - 如果它已满,则返回第二个参数。到目前为止,它看起来像这样并且运行良好

awk -v PARAM_NAME="user" '{ if ($1 == "\""PARAM_NAME"\":") { print $2;}}'

现在,我想添加一个检查,看看第二个参数是否以某个字符结尾。我知道,为了读取 $2 的最后一个字符,我需要像这样读取它。

echo "${2: -1}"

问题是 - 我不知道如何正确地逃避那些双重 quetes (或者至少那是我认为问题所在)。这就是我现在所拥有的,有人可以告诉我它有什么问题吗?谢谢

awk -v PARAM_NAME="user" '{ if ($1 == "\""PARAM_NAME"\":" && "${2: -1}" == "\"","\"") { print $2;}}'

整个命令

cf env some-odata-app | grep "\"hana\":" -A 30 | awk -v PARAM_NAME="user" -v lastchar="${2: -1}" '{ if ($1 == "\""PARAM_NAME"\":" && lastchar == ",") { print substr($2, 2, length($2)-3);}}'

前两个命令后的预期输入。我想从引号中清除密码和用户。所以需要知道是否要从末尾剪切两个或三个字符

"hana": [
   {
    "binding_name": null,
    "credentials": {  
     "password": "obfuscated",
     "schema": "oiuhjoiuhyupoihj",
     "url": "pkpokpokp[kjpo[kpo",
     "user": "USER"
    },
 
  ]

标签: awkquotation-marks

解决方案


OP 可以添加第二个-v标志来拉入 shell 变量的最后一个字符,例如:

awk -v PARAM_NAME="xxx_param" -v lastchar="${2: -1}" '{ if ($1 == "\""PARAM_NAME"\":" && lastchar == "\""e"\"") { print $2;}}'

如果目标是找到输入字段的最后一个字符,我们可以使用length()substr()函数的组合,例如,

$ awk '{ print substr($1,length($1),1) }' <<< 'STUVWXYZ'
Z

推荐阅读