问题描述
我有一个带有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计划如何捕获和使用这些值来重新格式化输出。