【问题标题】:Parsing Json data columnwise in shell在shell中按列解析Json数据
【发布时间】:2013-10-30 23:14:08
【问题描述】:

当我运行命令时,我会得到这样的响应

{

    "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 中,所以列式 awk 格式不起作用。

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

【问题讨论】:

标签: bash shell awk


【解决方案1】:

JSON 解析器更适合此任务

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

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

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

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

如果你完全无法使用 python,那么这里有实用程序 jqlink

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

我会用 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

【讨论】:

  • 那行得通。但是我不允许使用 Python,简单的 bash 命令,如 awk、grep、sed、head、tail,你懂的。
  • 是什么限制了你使用 python ? Python 在 LSB(Linux 标准库)中。所以它应该在每个 linux 发行版上都可用。
  • @Waterlink 这在 AIX 中也可以吗?我现在无法在 AIX 上进行测试,但我可能需要在几天后进行测试。
  • @MAD_ABOUT_JAVA 我在这里遇到了你的问题。那么你完全无法使用 python )你可以尝试从源代码构建 jq。
  • 是的,这样更好。感谢 Waterlink 的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2021-01-24
  • 2017-01-06
相关资源
最近更新 更多