如何从给定的json中提取单个值?
{
"Vpc": {
"InstanceTenancy": "default",
"State": "pending",
"VpcId": "vpc-123",
"CidrBlock": "10.0.0.0/16",
"DhcpOptionsId": "dopt-123"
}
}
试过这个,但没有运气:
grep -e '(?<="VpcId": ")[^"]*'
答案 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,也非常支持管道。