Shell脚本-在awk命令中正确引用

问题描述

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

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

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

echo "${2: -1}"

问题是-我不知道如何正确地逃脱那些双层地毯(或者至少那是我认为问题所在的地方)。这就是我现在所拥有的,有人可以告诉我这是怎么回事吗?谢谢

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"
    },]

解决方法

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
,

问题的要旨似乎已从“将shell参数传递到awk”变为“从awk变量/字段拉出最后一个字符”变为“从cf / grep命令批处理中解析出用户和密码”。 / p>

cf/grep命令批处理生成的数据示例:

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

OP希望运行2个单独的命令,一个用于提取user,另一个用于提取password

一种使用双引号作为输入字段分隔符的awk解决方案:

$ awk -F'"' -v PARAM_NAME="user" '$2 == PARAM_NAME { print $4 }' hana.dat
USER
$ awk -F'"' -v PARAM_NAME="password" '$2 == PARAM_NAME { print $4 }' hana.dat
obfuscated

请记住,我们还可以通过单个awk调用来提取两个值,例如:

$ awk -F'"' '$2 == "password" || $2 == "user" {print $4}' hana.dat
obfuscated
USER

一个模拟grep/cut解决方案的awk想法:

$ grep -E 'password|user' hana.dat | cut -d'"' -f4
obfuscated
USER

注意:很可能需要根据OP计划如何捕获和使用这些值来重新格式化输出。