在shell中逐列解析Json数据

时间:2013-10-22 07:39:07

标签: bash shell awk

当我运行命令时,我会收到类似这样的回复

{

    "status": "available",
    "managed": true,
    "name":vdisk7,
    "support":{
    "status": "supported"
    },
    "storage_pool": "pfm9253_pfm9254_new",
    "id": "ff10abad"-2bf-4ef3-9038-9ae7f18ea77c",
    "size":100
},

以及数百种此类列表或词典 我想要一个能做这种事情的命令

if name = "something", 
    get the id

任何有助于我学习此类命令的链接都将受到高度赞赏

我试过了

awk'{if($ 2 ==“something”)print $ 0;}'

但我认为响应是在Json中,因此colum明智的awk格式化不起作用。

此外,它只需要运行一个命令,所以我不想使用任何外部库。

1 个答案:

答案 0 :(得分:12)

JSON解析器更适合此任务

awksed是解析面向行的文本的实用程序,但不是json。如果你的json格式会改变怎么办? (有些行会在一行上吗?)。

你应该使用任何标准的json解析器。或者使用一些强大的脚本语言,如PHP,Python,Ruby等。

我可以为您提供有关如何使用python进行操作的示例。

如果我无法使用强大的脚本语言怎么办?

如果你完全不能使用python,那么那里有实用工具jqlink

如果你有一些最近的发行版,jq可能已经在存储库中(例如:Ubuntu 13.10在repos中有它)。

我可以使用python!

我会使用简单的python内联脚本来做到这一点。

例如,我们有一些some_command作为结果返回json。

我们必须获得data["name"]的价值。

我们走了:

some_command | python -c "import json, sys; print json.load(sys.stdin)['name']"

它会在您的案例中输出vdisk7

为此,你需要确定,json是完全有效的。

如果你有一个json对象列表:

[
  {
    ...
    "name": "vdisk17"
    ...
  },
  {
    ...
    "name": "vdisk18"
    ...
  },
  {
    ...
    "name": "vdisk19"
    ...
  },
...
]

您可以使用一些列表推导:

some_command | python -c "import json, sys; [sys.stdout.write(x['name'] + '\n') for x in json.load(sys.stdin)]"

将输出:

vdisk17
vdisk18
vdisk19