Shell 脚本 - 在 awk 命令中正确引用
Shell script - proper quoting in the awk command
我有一个带有 2 个参数和一个条件的 awk 命令 - 如果它已填满,它是 returns 第二个参数。到目前为止,它看起来像这样并且运行良好
awk -v PARAM_NAME="user" '{ if ( == "\""PARAM_NAME"\":") { print ;}}'
现在,我想添加一项检查,看看第二个参数是否以某个字符结尾。我知道,为了读取 $2 的最后一个字符,我需要像这样读取它。
echo "${2: -1}"
问题是 - 我不知道如何正确地转义那些双重问题(或者至少那是我认为问题所在的地方)。这就是我现在所拥有的,有人可以告诉我它有什么问题吗?谢谢
awk -v PARAM_NAME="user" '{ if ( == "\""PARAM_NAME"\":" && "${2: -1}" == "\"","\"") { print ;}}'
整个命令
cf env some-odata-app | grep "\"hana\":" -A 30 | awk -v PARAM_NAME="user" -v lastchar="${2: -1}" '{ if ( == "\""PARAM_NAME"\":" && lastchar == ",") { print substr(, 2, length()-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 ( == "\""PARAM_NAME"\":" && lastchar == "\""e"\"") { print ;}}'
如果 objective 是查找输入字段的最后一个字符,我们可以结合使用 length()
和 substr()
函数,例如,
$ awk '{ print substr(,length(),1) }' <<< 'STUVWXYZ'
Z
问题的要点似乎已从 'passing shell parameters into awk' 更改为 'pulling last character from a awk variable/field' 再到 'parsing out the user and password from a cf/grep command batch'。
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" ' == PARAM_NAME { print }' hana.dat
USER
$ awk -F'"' -v PARAM_NAME="password" ' == PARAM_NAME { print }' hana.dat
obfuscated
请记住,我们也可以通过单个 awk
调用提取两个值,例如:
$ awk -F'"' ' == "password" || == "user" {print }' hana.dat
obfuscated
USER
一个 grep/cut
模仿 awk
解决方案的想法:
$ grep -E 'password|user' hana.dat | cut -d'"' -f4
obfuscated
USER
注意:可能需要根据 OP 计划如何捕获和使用这些值来重新格式化输出。
我有一个带有 2 个参数和一个条件的 awk 命令 - 如果它已填满,它是 returns 第二个参数。到目前为止,它看起来像这样并且运行良好
awk -v PARAM_NAME="user" '{ if ( == "\""PARAM_NAME"\":") { print ;}}'
现在,我想添加一项检查,看看第二个参数是否以某个字符结尾。我知道,为了读取 $2 的最后一个字符,我需要像这样读取它。
echo "${2: -1}"
问题是 - 我不知道如何正确地转义那些双重问题(或者至少那是我认为问题所在的地方)。这就是我现在所拥有的,有人可以告诉我它有什么问题吗?谢谢
awk -v PARAM_NAME="user" '{ if ( == "\""PARAM_NAME"\":" && "${2: -1}" == "\"","\"") { print ;}}'
整个命令
cf env some-odata-app | grep "\"hana\":" -A 30 | awk -v PARAM_NAME="user" -v lastchar="${2: -1}" '{ if ( == "\""PARAM_NAME"\":" && lastchar == ",") { print substr(, 2, length()-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 ( == "\""PARAM_NAME"\":" && lastchar == "\""e"\"") { print ;}}'
如果 objective 是查找输入字段的最后一个字符,我们可以结合使用 length()
和 substr()
函数,例如,
$ awk '{ print substr(,length(),1) }' <<< 'STUVWXYZ'
Z
问题的要点似乎已从 'passing shell parameters into awk' 更改为 'pulling last character from a awk variable/field' 再到 'parsing out the user and password from a cf/grep command batch'。
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" ' == PARAM_NAME { print }' hana.dat
USER
$ awk -F'"' -v PARAM_NAME="password" ' == PARAM_NAME { print }' hana.dat
obfuscated
请记住,我们也可以通过单个 awk
调用提取两个值,例如:
$ awk -F'"' ' == "password" || == "user" {print }' hana.dat
obfuscated
USER
一个 grep/cut
模仿 awk
解决方案的想法:
$ grep -E 'password|user' hana.dat | cut -d'"' -f4
obfuscated
USER
注意:可能需要根据 OP 计划如何捕获和使用这些值来重新格式化输出。