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

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

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

$ aws ssm get-parameter --name /mysite/dev/email
{
    "Parameter": {
        "Name": "/mysite/dev/email",
        "Type": "String",
        "Value": "[email protected]",
        "Version": 1
    }
}

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

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

"[email protected]",

正如您所看到的,我使用 : 作为通过 F 标志进行分隔。我将该行与字符串“Value”匹配,然后打印分隔字符串的第二部分,即值“[电子邮件受保护]”,

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

$ aws ssm get-parameter --name /mysite/dev/email | awk -F: '/Value/ {print $2}' | sed -E 's/"|",//g'
 [email protected]

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

答案1

对于单行,您只需删除全部首先是逗号和引号。

awk '/Value/ { gsub(/[",]/,""); print $2}'

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

awk '/Value/ { gsub(/[",]/,"",$2); print $2}'

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

答案2

用于解析出顶层结构中keyjq的值:ValueParameter

aws ssm get-parameter --name /mysite/dev/email | jq -r '.Parameter.Value'

这还将额外解码该值的任何 JSON 编码,以便存储在 JSON 中的值返回为.\"The Admin\" <[email protected]>"The Admin" <[email protected]>

相关内容