如何从Json中使用grep检索单个值?

时间:2016-03-17 23:48:31

标签: shell grep

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

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

试过这个,但没有运气:

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

5 个答案:

答案 0 :(得分:7)

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

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

如果GNU grep及其-P选项不可用,我们无法使用环视功能,必须使用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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

你可以这样做:

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"]);'

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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