Какой системный администратор Linux не любит хорошенько грепнуть? Это очень полезный навык, который осваиваешь практически сразу, как начинаешь работать в консоли и тем более писать какие-то скрипты. Но есть формат json, который бессмысленно грепать, потому что с большой вероятностью получишь не то, что тебе надо, так как там все данные либо в одной строке, либо построчно иерархически разбиты.
Какой-то добрый человек решил спасти системных администраторов из прошлого и придумал утилиту, которая позволяет успешно грепать json - gron. Лозунг программы - Make JSON greppable!
Покажу на примере, зачем она может понадобиться. У меня есть статья по мониторингу посещаемости сайтов, где данные берутся из Яндекс.Метрики в формате json. Беру обрезанный кусок json, для наглядного примера:
{ "query" : { "ids" : [ 23506456 ], "dimensions" : [ "ym:s:searchEngine" ], "metrics" : [ "ym:s:users", "ym:s:visits", "ym:s:pageviews" ], "sort" : [ "-ym:s:users" ],},"data" : [ { "dimensions" : [ "ym:s:searchEngine" ], "metrics" : [ 2117.0, 2450.0, 3211.0 ] } ]}
Вам надо выхватить все значения из data Так просто их не грепнешь в один присест. А через gron очень просто:
# curl ....... | gron | grep datajson.data = [];json.data[0] = {};json.data[0].dimensions = ["ym:s:searchEngine"];json.data[0].metrics = [];json.data[0].metrics[0] = 2147.0;json.data[0].metrics[1] = 2489.0;json.data[0].metrics[2] = 3271.0;json.data_lag = 0;
Получили список всех значений data в построчном формате. При желании грепается любое конкретное значение (не забываем про экранирование):
# curl ....... | gron | grep "data\[0\].metrics\[2\]"json.data[0].metrics[2] = 3271.0;
Эта утилита для тех, кто по какой-то причине не может или не хочет использовать jsonpath в jq. С его помощью какое-то одно конкретное значение вытащить гораздо проще:
# curl ....... | jq '.data[].metrics[2]'3271.0
Конкретно в данном примере gron не особо нужен. Это просто первое, что в голову пришло. Им будет удобно грепнуть очень большую лапшу json, которая прилетит к вам в терминал. А это обычное дело. Например, когда я настраивал мониторинг ZONT, мне в консоль вываливалась такая лапша, что на экран не помещалась.
Также с помощью gron удобно сравнить два json:
# diff <(gron first.json) <(gron second.json)7c3< json.data[0].metrics[2] = 3271.0;---> json.data[0].metrics[2] = 3531.0;
Исходники - https://github.com/tomnomnom/gron
#json