【问题标题】:How to extract JSON string from a longer mixed string in a shell script如何从 shell 脚本中较长的混合字符串中提取 JSON 字符串
【发布时间】:2019-12-10 12:18:02
【问题描述】:

给定以下字符串:

arn:aws:secretsmanager:us-east-1:3264873466873:secret:foo/bar 1564681234.974 foo/bar {"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"} 4e397333-3797-4f0b-ad7e-8c1cc0ed041c VERSIONSTAGES AWSCURRENT

在 shell 脚本中,如何仅提取 JSON 部分以得到如下结果:

{"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"}

我可以使用两个 sed 命令来做到这一点:

echo $longString | sed 's/^.*{/{/' | sed 's/}.*$/}/'

但想知道是否有一种方法可以只使用一个命令。

【问题讨论】:

  • grep -o '{.*}' 也许?

标签: json shell awk sed


【解决方案1】:

awk 应该这样做。如果字符串中有空格,我会处理。

echo $string | awk -F"[{}]" '{print $2}'
"username":"admin","password":"admin123","secret_key":"KASJDFJHAKHFKAHASDF"

【讨论】:

    【解决方案2】:

    要提取输入的连续部分,您可以使用 grep 及其 -o 选项(如果您的系统支持)。它告诉 grep 只输出匹配的部分。

    grep -o '{.*}'
    

    【讨论】:

      【解决方案3】:

      您可以将 sed 命令加入到单个命令中 sed 's/^.*{/{/;s/}.*$/}/'

      【讨论】:

        【解决方案4】:

        你可以使用

        echo $longString | sed -n 's|.*\({.*}\).*|\1|p'
        

        匹配并打印所需的模式

        【讨论】:

          【解决方案5】:

          要提取列,请使用awk:

          echo $longString | awk '{print $4}'
          

          cut:

          echo $longString | cut -f 4 -d ' ' 
          

          请注意您的 JSON 数据中是否包含空格。您最好使用jq 来处理aws secretsmanager list-secrets 和类似的结果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-20
            • 1970-01-01
            • 2020-12-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-19
            相关资源
            最近更新 更多