如何在 shell 上解析 JSON 输出?
例如,Amazon Web Services 提供 CLI 来检索实例的状态:
$ aws ec2 describe-instances <my_instance_id>
但该命令返回一个 JSON 字符串。该命令的输出如下所示:
$ aws ec2 describe-instances x12345
{
"Reservations" :
{
"OwnerId": "1345345"
"Groups": [],
"SecurityGroups": [
{
"Foo" : "yes"
"Bar" : "no
}
]
}
}
是否有可用于解析 JSON 输出的内置 shell?
例如,我想在 shell 变量中捕获FOO
以下内容output["Reservations"]["SecurityGroups"][0]{"Foo"}
。
如果有帮助的话,我对可以在 Zsh 上运行的解决方案特别感兴趣。
答案1
据我了解,您正在寻找“Foo”的值。这是真的使用 shell 命令行工具很容易做到jq
。sed
就像它实现了自己的解析器语言一样。鉴于你的例子:
json='
{
"Reservations" :
{
"OwnerId" : "1345345",
"Groups" : [],
"SecurityGroups" : [
{
"Foo" : "yes",
"Bar" : "no"
}
]
}
}'
jq
可以yes
简单地得到:
printf %s "$json" |
jq '.[].SecurityGroups[0].Foo?'
输出
"yes"
您可以使用.dot
符号遍历对象散列或字典列表,并且可以使用数字方括号索引更简单地对索引数组进行索引,正如您可能已经猜到的那样。在上面的命令中,我使用空索引形式来指示我希望扩展该级别的所有可迭代项。这样理解可能更容易理解:
printf %s "$json" | jq '.[][]'
...这会分解散列中第二级项目的所有值并让我...
"1345345"
[]
[
{
"Foo": "yes",
"Bar": "no"
}
]
这仅仅触及了jq
的功能的表面。它是一个非常强大的工具,用于在 shell 中序列化数据,它以经典的 Unix 风格编译为单个可执行二进制文件,很可能可以通过您的发行版的包管理器获得它,并且它有很好的文档记录。请访问其git
-页亲自看看。
顺便说一句,处理分层数据的另一种方法json
- 至少了解您正在使用的内容 - 可能是采用另一种方式并使用符号.dot
来突破全部值在全部级别如:
printf %s "$json" | jq '..'
{
"Reservations": {
"OwnerId": "1345345",
"Groups": [],
"SecurityGroups": [
{
"Foo": "yes",
"Bar": "no"
}
]
}
}
{
"OwnerId": "1345345",
"Groups": [],
"SecurityGroups": [
{
"Foo": "yes",
"Bar": "no"
}
]
}
"1345345"
[]
[
{
"Foo": "yes",
"Bar": "no"
}
]
{
"Foo": "yes",
"Bar": "no"
}
"yes"
"no"
但更好的方法可能是仅使用jq
为各种类型的节点提供的众多发现或搜索方法中的一种。
答案2
这是对你的目标的答案,但不是你的问题。这意味着您无需使用 JSON 解析器即可实现您的目标。
AWS cli util 能够仅使用参数输出选择字段--query
。这是有记录的这里。
例如:
$ aws ec2 describe-instances \
--query 'Reservations[0].Instances[0].SecurityGroups[0].GroupName' \
--instance-id i-6b272337 \
--output text
mongodb
如果您愿意,您甚至可以选择多个字段:
$ aws ec2 describe-instances \
--query 'Reservations[0].Instances[0].SecurityGroups[0].[GroupName,GroupId]' \
--instance-id i-6b272337 \
--output text
mongodb sg-710ffa14
您还可以显示多个匹配的结构:
$ aws ec2 describe-instances \
--query 'Reservations[0].Instances[0].SecurityGroups[*].[GroupName,GroupId]' \
--instance-id i-6b272337 \
--output text
mongodb sg-710ffa14
default sg-a0243bcc