虽然我可能会诊断事件的根本原因,确定它影响了多少用户,或者提取时间日志以评估最近代码更改对性能和吞吐量的影响,但我的工具保持不变:grep
、awk
、 sed
、 tr
、 uniq
、 sort
、 zcat
、 tail
、 head
、 join
和 split
。为了将它们粘合在一起,Unix 为我们提供了管道,而对于更高级的过滤,我们有 xargs
。如果这些让我失望,总是有 perl -e
。
这些工具非常适合处理 CSV 文件、制表符分隔的文件、具有可预测行格式的日志文件或具有逗号分隔键值对的文件。换句话说,每行几乎没有上下文的文件。
我最近需要浏览千兆字节的 XML 来构建用户使用情况的直方图。使用我拥有的工具这很容易,但是对于更复杂的查询,常规方法会失效。假设我有这样的文件:
<foo user="me">
<baz key="zoidberg" value="squid" />
<baz key="leela" value="cyclops" />
<baz key="fry" value="rube" />
</foo>
假设我想生成一个从用户到每个 <baz>
的平均 <foo>
数量的映射。逐行处理不再是一种选择:我需要知道我当前正在检查哪个用户的 <foo>
,以便我知道要更新谁的平均值。完成这项任务的任何类型的 Unix one 类轮都可能难以理解。
幸运的是,在 XML 领域,我们有 XPath、XQuery 和 XSLT 等出色的技术来帮助我们。
以前,我习惯于使用出色的 XML::XPath
Perl 模块来完成上述查询,但在找到 TextMate Plugin that could run an XPath expression against my current window 后,我停止编写一次性 Perl 脚本来查询 XML。我刚刚发现 XMLStarlet 在我输入时正在安装,我期待在未来使用它。
所以这引出了我的问题:有没有类似的 JSON 工具?一些调查任务需要我对 JSON 文件进行类似的查询只是时间问题,而且如果没有 XPath 和 XSLT 等工具,这样的任务将会困难得多。如果我有一堆看起来像这样的 JSON:
{
"firstName": "Bender",
"lastName": "Robot",
"age": 200,
"address": {
"streetAddress": "123",
"city": "New York",
"state": "NY",
"postalCode": "1729"
},
"phoneNumber": [
{ "type": "home", "number": "666 555-1234" },
{ "type": "fax", "number": "666 555-4567" }
]
}
想要找到每个人拥有的电话号码的平均数量,我可以用 XPath 做这样的事情:
fn:avg(/fn:count(phoneNumber))
我注意到越来越多的数据序列化正在使用 JSON 完成,因此在未来分析大型数据转储时,此类处理工具将至关重要。 JSON 的语言库非常强大,编写脚本来进行这种处理很容易,但要真正让人们玩转数据外壳工具是需要的。
最佳答案
我刚刚发现了这个:
http://stedolan.github.io/jq/
“jq 是一个轻量级且灵活的命令行 JSON 处理器。”
2014 年更新:
@user456584 提到:
There's also the 'json' command (e.g. 'jsontool'). I tend to prefer it over jq. Very UNIX-y. Here's a link to the project: github.com/trentm/json –
在 http://github.com/trentm/json 的 json
README 中有一长串类似的东西
- jq: http://stedolan.github.io/jq/
- json:select: http://jsonselect.org/
- jsonpipe: https://github.com/dvxhouse/jsonpipe
- json-command: https://github.com/zpoley/json-command
- JSONPath: http://goessner.net/articles/JsonPath/, http://code.google.com/p/jsonpath/wiki/Javascript
- jsawk: https://github.com/micha/jsawk
- jshon: http://kmkeen.com/jshon/
- json2: https://github.com/vi/json2
- fx: https://github.com/antonmedv/fx
https://stackoverflow.com/questions/2933126/