Общая проблема
 Хотя я, возможно, диагностирую основную причину события, определяю, сколько пользователей оно затронуло, или извлекаю журналы синхронизации, чтобы оценить влияние недавнего изменения кода на производительность и пропускную способность, мои инструменты остаются grep же: grep, awk, sed, tr, uniq, sort, zcat, tail, head, join и split. Чтобы склеить их все вместе, Unix дает нам каналы, а для более xargs фильтрации у нас есть xargs. Если они меня perl -e, всегда есть perl -e.
Эти инструменты идеально подходят для обработки файлов CSV, файлов с разделителями табуляции, файлов журналов с предсказуемым форматом строки или файлов с разделенными запятыми парами ключ-значение. Другими словами, файлы, в которых каждая строка не имеет контекста.
Аналоги XML
Недавно мне потребовалось пролистать гигабайты 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 liner, который выполняет эту задачу, вероятно, будет непостижимым.
К счастью, в области XML у нас есть замечательные технологии, такие как XPath, XQuery и XSLT, которые могут нам помочь.
 Ранее я привык использовать замечательный модуль Perl XML::XPath для выполнения запросов, подобных приведенному выше, но после нахождения плагина TextMate, который может запускать выражение XPath для моего текущего окна, я перестал писать одноразовые сценарии Perl для запросить XML. И я только что узнал о XMLStarlet, который устанавливается при наборе этого текста и который я с нетерпением жду в будущем.
Решения JSON?
Так что это приводит меня к моему вопросу: есть ли такие инструменты для 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 в командной строке Unix, какие инструменты вы используете?
 - Черт, есть ли работа по созданию такого языка запросов для JSON?
 - Если вы используете такие инструменты в своей повседневной работе, что вам нравится/не нравится в них? Есть ли какие-нибудь ошибки?
 
Я отмечаю, что все больше и больше сериализации данных выполняется с использованием JSON, поэтому такие инструменты обработки будут иметь решающее значение при анализе больших дампов данных в будущем. Языковые библиотеки для JSON очень сильны, и достаточно просто написать сценарии для такой обработки, но для того, чтобы люди действительно могли поиграть с инструментами оболочки данных, необходимы.

