Обложка канала

ServerAdmin.ru

12437 @srv_admin

Авторская информация о системном администрировании.

ServerAdmin.ru

4 года назад
Открыть в
Какой системный администратор 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 data json.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