使用 awk 从 bash shell 中提取 json 值,而不必同时求助于 awk 和 sed

Dan*_*one 4 sed awk json aws

aws 命令将 json 字符串返回到 bash shell 内的标准输出。

$ aws ssm get-parameter --name /mysite/dev/email
{
    "Parameter": {
        "Name": "/mysite/dev/email",
        "Type": "String",
        "Value": "admin@example.com",
        "Version": 1
    }
}
Run Code Online (Sandbox Code Playgroud)

我想返回“Value”的值,而不用引号括起来。我使用了 awk 和 sed linux 程序的组合。基本上,awk 搜索输入中的每一行,并允许您返回具有匹配值的行。由于 awk 逐行扫描文件,允许您将行拆分为字段并对匹配的模式执行操作,因此我首先这样做:

$ aws ssm get-parameter --name /mysite/dev/email | awk -F: '/Value/ {print $2}'

"admin@example.com",
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我使用 : 作为通过 F 标志进行分隔。我将该行与字符串“Value”匹配,然后打印分隔字符串的第二部分,即值“user@example.com”,

但引号和逗号不受欢迎。所以我必须使用 sed 和 -E 正则表达式标志来替换引号和逗号:

$ aws ssm get-parameter --name /mysite/dev/email | awk -F: '/Value/ {print $2}' | sed -E 's/"|",//g'
 admin@example.com
Run Code Online (Sandbox Code Playgroud)

我得到了想要的结果,但我更愿意只使用 awk,而不是通过管道将 awk 传输到 sed。是否可以?

ica*_*rus 5

对于单行,您可以先删除所有逗号和引号。

awk '/Value/ { gsub(/[",]/,""); print $2}'
Run Code Online (Sandbox Code Playgroud)

一个更好的 awk 翻译 | sed 管道将是

awk '/Value/ { gsub(/[",]/,"",$2); print $2}'
Run Code Online (Sandbox Code Playgroud)

仅更改第二个字段中的值。