TGViewer
ServerAdmin.ru ServerAdmin.ru @srv_admin · 32.6K subscribers
Post #2075 6.96K
Какой системный администратор 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
  • 👍 65
  • 👎 5
More from @srv_admin
  1. Oct 7, 2026Рассказываю про одну простую, но очень полезную в хозяйстве штуку для передачи файлов межд…
  2. Oct 7, 2026❓Какие реальные возможности у 1С:Расширенная корпоративная лицензия (1С:РКЛ) и как компани…
  3. Oct 7, 2026Столкнулся на днях с типичной ситуацией, когда катастрофически вырос Load Average на серве…
  4. Oct 6, 2026🎉 10 лет Kaspersky Anti Targeted Attack — юбилейный стрим! Друзья, делимся анонсом важног…
  5. Oct 6, 2026Компания Selectel выкатила в public preview своего бесплатного ИИ-агента aish. Далее будет…
  6. Oct 5, 2026На прошлой неделе Mikrotik сделал рассылку с обзором своих новых продуктов. Я последние го…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →