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

Shell脚本-在awk命令中正确引用,awk,quotation-marks,Awk,Quotation Marks,我有一个带有两个参数和一个条件的awk命令-如果它是fullfilled,它将返回第二个参数。到目前为止,它看起来像这样,并且运行良好 awk -v PARAM_NAME="user" '{ if ($1 == "\""PARAM_NAME"\":") { print $2;}}' 现在,我想添加一个检查,看看第二个参数是否以某个字符结尾。我知道,为了读$2的最后一个字符,我需要这样读 echo "${2

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

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

$awk'{print substr($1,length($1),1)}'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

$awk'{print substr($1,length($1),1)}'问题的要点似乎已经从“将shell参数传递到awk”变为“从awk变量/字段中提取最后一个字符”变为“从cf/grep命令批中解析出用户和密码”

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

$ cat hana.dat
"hana": [
   {
    "binding_name": null,
    "credentials": {  
     "password": "obfuscated",
     "schema": "oiuhjoiuhyupoihj",
     "url": "pkpokpokp[kjpo[kpo",
     "user": "USER"
    },
   ]
OP希望运行两个单独的命令,一个用于提取
用户
,另一个用于提取
密码

一种使用双引号作为输入字段分隔符的
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
一个模拟
awk
解决方案的
grep/cut
想法:

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

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

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

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

$ cat hana.dat
"hana": [
   {
    "binding_name": null,
    "credentials": {  
     "password": "obfuscated",
     "schema": "oiuhjoiuhyupoihj",
     "url": "pkpokpokp[kjpo[kpo",
     "user": "USER"
    },
   ]
OP希望运行两个单独的命令,一个用于提取
用户
,另一个用于提取
密码

一种使用双引号作为输入字段分隔符的
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
一个模拟
awk
解决方案的
grep/cut
想法:

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

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

将shell变量传递给
awk
应该是
awk-v var=“$shell\u variable”{……}“
由于您的问题不清楚,请您添加更多的详细信息,以便我们更好地理解您的问题。您好,这是整个命令的外观。它从Cloud Foundry获取env变量并尝试清除引号,问题是json中的最后一个变量没有以coma结尾,因此在解析它时最后一个字符被截断。现在只需确定最后一个字符,就需要处理这两个场景->cf env hana cloud analytics odata app | grep“\“xsuaa\”:“-A 30 | awk-v PARAM_NAME=“xxx_PARAM”{if($1=“\”PARAM_NAME“:”&&&“${2:-1}”!=“\”,“\”,“\”){print substr 2,2,length($2)-3)}}“如果你能用样本输入和期望输出(与样本输入相对应)更新问题,那么理解需求就会容易一些。好的,更新-尽量减少问题,可能不是个好主意:)预期输出是什么<代码>用户
模糊
在单独的行上?两个值在一行上并带有分隔符(空白?逗号?冒号?)?您需要将这两个值捕获到调用shell脚本中的变量中,还是只打印到stdout?将shell变量传递给
awk
应该是
awk-v var=“$shell_variable”{..}“
由于您的问题不清楚,请您添加更多的详细信息,以便我们更好地理解您的问题。您好,这是整个命令的外观。它从Cloud Foundry获取env变量并尝试清除引号,问题是json中的最后一个变量没有以coma结尾,因此在解析它时最后一个字符被截断。现在只需确定最后一个字符,就需要处理这两个场景->cf env hana cloud analytics odata app | grep“\“xsuaa\”:“-A 30 | awk-v PARAM_NAME=“xxx_PARAM”{if($1=“\”PARAM_NAME“:”&&&“${2:-1}”!=“\”,“\”,“\”){print substr 2,2,length($2)-3)}}“如果你能用样本输入和期望输出(与样本输入相对应)更新问题,那么理解需求就会容易一些。好的,更新-尽量减少问题,可能不是个好主意:)预期输出是什么<代码>用户
模糊
在单独的行上?两个值在一行上并带有分隔符(空白?逗号?冒号?)?您需要将这两个值捕获到调用shell脚本的变量中,还是只打印到stdout?太棒了!在实际命令开始之前获取它是个好主意。最后一个问题-如果我不想比较e字符,但例如coma,该怎么办?我不确定我是否理解。。。最后一个字符是逗号吗?还是你想比较t