【问题标题】:How to retrieve single value with grep from Json?如何使用 Json 中的 grep 检索单个值?
【发布时间】:2016-07-04 13:50:52
【问题描述】:

如何从给定的 json 中提取单个值?

{
  "Vpc": {
    "InstanceTenancy": "default", 
    "State": "pending", 
    "VpcId": "vpc-123", 
    "CidrBlock": "10.0.0.0/16", 
    "DhcpOptionsId": "dopt-123"
  }
}

试过了,但没有运气:

grep -e '(?<="VpcId": ")[^"]*'

【问题讨论】:

    标签: shell grep


    【解决方案1】:

    您可能想要-Po,它适用于您的正则表达式:

    $ grep -oP '(?<="VpcId": ")[^"]*' infile
    vpc-123
    

    如果带有 -P 选项的 GNU grep 不可用,我们就不能使用环视,而不得不求助于例如使用 grep 两次:

    $ grep -o '"VpcId": "[^"]*' infile | grep -o '[^"]*$'
    vpc-123
    

    第一个提取直到并排除结束引号,第二个从行尾搜索非引号。

    但是,如前所述,最好正确解析 JSON。除了另一个答案中提到的jq,我知道

    一个 jq 解决方案就像这样简单:

    $ jq '.Vpc.VpcId' infile 
    "vpc-123"
    

    或者,获取原始输出而不是 JSON:

    $ jq -r '.Vpc.VpcId' infile 
    vpc-123
    

    【讨论】:

    • 谢谢,但 Mac OS X El Capitan 上不支持开箱即用的 P 选项。我不想安装插件。
    • @Centurion 我认为在单个 grep 命令中是不可能的,我添加了一个使用 grep 两次的解决方案。
    • 如果 json 存储在变量中,试试这个:echo $json | grep -o '"VpcId": "[^"]*' | grep -o '[^"]*$'
    【解决方案2】:

    如果您可以安装工具,我建议您使用 jq jq。它允许非常简单的 grep,对管道也有很好的支持。

    【讨论】:

      【解决方案3】:

      试试这个正则表达式模式:

      \"VpcId\":\s?(\"\S+\")
      

      【讨论】:

      • 不,不返回任何东西
      【解决方案4】:

      你可以这样做:

      sed -r -n -e '/^[[:space:]]*"VpcId":/s/^[^:]*: *"(.*)", *$/\1/p'
      

      但实际上,使用任何 shell 工具在 JSON 内容上运行正则表达式都是一个坏主意。你应该考虑一个更理智的语言,比如python

      python -c 'import json, sys; print(json.loads(sys.stdin.read())["Vpc"]["VpcId"]);'
      

      【讨论】:

        【解决方案5】:

        类似

        grep '^ *"VpcId":' json.file \
          | awk '{ print $2 }' \
          | sed -e 's/,$//' -e 's/^"//' -e 's/"$//'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          • 2018-11-20
          • 2018-10-17
          • 2019-01-05
          • 2018-09-29
          • 1970-01-01
          相关资源
          最近更新 更多