Общая проблема
Несмотря на то, что я могу диагностировать основную причину события, определить, сколько пользователей оно затронуло, или извлечь журналы времени, чтобы оценить влияние недавнего изменения кода на производительность и пропускную способность, мои инструменты остаются прежними: grep
, awk
, sed
, tr
, uniq
, sort
, zcat
, tail
, head
, join
и split
. Чтобы склеить их все вместе, Unix дает нам каналы, а для более сложной фильтрации у нас есть xargs
. Если это подведет меня, всегда есть 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, чтобы помочь нам.
Раньше я привык к использованию замечательного XML::XPath
модуля Perl для выполнения запросов, подобных приведенному выше, но после нахождения плагина 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 очень сильны, и достаточно просто написать сценарии для такой обработки, но для того, чтобы люди действительно могли поиграть с инструментами оболочки данных, необходимы.
Смежные вопросы