在Linux系统中使用Shell脚本解析JSON

4

我有一个类似下面例子的JSON字符串,我想在shell脚本中使用"uptime"命令的值作为变量,该怎么办?

{ "serverStatus" : { "version" : "1.6.0", "uptime" : 527, "uptimeEstimate" : 526, "localTime" : { "$date" : 1286923624579 }, "globalLock" : { "totalTime" : 526604302, "lockTime" : 3499842, "ratio" : 0.006646056605895331, "currentQueue" : { "total" : 0, "readers" : 0, "writers" : 0 } }, "mem" : { "bits" : 64, "resident" : 150, "virtual" : 76114, "supported" : true, "mapped" : 75950 }, "connections" : { "current" : 1, "available" : 9599 }, "extra_info" : { "note" : "fields vary by platform", "heap_usage_bytes" : 600592, "page_faults" : 1838 }, "indexCounters"....

注:此问题已被其他人提问,您可以查看这里

鉴于 http://json.org/ 上缺少 bash、csh、zsh、tcsh 等库,请编写一个库并贡献出来? - Quentin
2
@Josh:你编辑的一切都属于我们。 - skaffman
2个回答

6
您可以使用带有json模块的编程语言,或者如果您想要一个shell + *nix工具解决方案,您可以使用awk。
$ awk -F"[,:]" '{for(i=1;i<=NF;i++){if($i~/uptime\042/){print $(i+1)} } }' file
 527

在他的示例JSON中,对于正常运行时间值可以工作。但是对于像HTML代码这样的值不起作用。 - VMcPherron
这对我有用..谢谢 - Neethu Lalitha
如果我错了,请纠正我。你的示例是用于子字符串比较的。在if循环中应该使用什么条件来检查$i是否等于uptime? - Neethu Lalitha

1

使用 Ruby 的版本:

cat file | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['serverStatus']['uptime'];"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接