Русский
Русский
English
Статистика
Реклама

Awk

Перевод Кунг-фу стиля Linux упрощение работы с awk

19.11.2020 16:18:00 | Автор: admin
Утилита awk это нечто вроде швейцарского ножа для обработки текстовых файлов. Но некоторые ограничения awk порой доставляют неудобства тем, кто этой утилитой пользуется. Я, для того чтобы упростить работу с awk, создал несколько функций. Но сразу хочу сказать о том, что для работы этих функций нужны возможности GNU-версии awk. Поэтому для того чтобы воспроизвести то, о чём я буду рассказывать, вам совершенно необходимо использовать gawk и ничего другого. Возможно, в вашей системе настроено сопоставление /usr/bin/awk с чем-то, и это что-то может представлять собой gawk. Но это может быть и mawk, и какая-то другая разновидность awk. Если вы используете дистрибутив Linux, основанный на Debian, то знайте, что команда update-alternatives это ваш хороший друг. В данном материале я буду исходить из предположения о том, что его читатель использует gawk.



После того, как вы прочитаете эту статью, вы узнаете о том, как пользоваться моей библиотекой дополнительных функций для awk. А именно, речь идёт о разделении строки на поля даже в условиях, когда не существует единого символа, используемого для разделения полей. Кроме того, вы сможете обращаться к полям, используя выбранные вами имена. Например, вам не придётся помнить о том, что $2 это поле, содержащее сведения о времени. Вместо этого можно будет просто воспользоваться конструкцией наподобие Fields_fields[time].

Проблема awk


Утилита awk берёт на себя решение множества стандартных задач обработки текстовых файлов. Она читает файлы, считывая по одной записи за раз. Обычно запись это одна строка. Затем awk разбивает строку на поля, ориентируясь на пробелы или на другие символы, используемые в качестве разделителей полей. Можно написать код, который что-то делает со считанной строкой или с отдельными полями. Эти стандартные возможности awk хорошо подходят для решения многих задач, особенно учитывая то, что можно настраивать разделители полей и признак конца записи. Такому формату соответствует удивительно большое количество файлов.

Правда, так устроены далеко не все файлы. Если нужно работать с данными из каких-нибудь логов или из баз данных, такие данные могут быть отформатированы с использованием самых разных подходов. Например, в некоторых полях могут присутствовать структурированные данные, при оформлении которых используются различные разделители. Это, конечно, не значит, что такие данные нельзя обработать с помощью awk. Так как в нашем распоряжении оказывается вся строка, с этой строкой можно сделать всё, что нужно. Но при обработке подобных строк усложняется логика программы. А главная цель использования awk это упрощение работы.

Например, предположим, что у нас имеется файл с данными, полученный с некоего устройства. В его строках имеется восьмизначный серийный номер, за которым следует тег длиной в шесть символов. Потом идут два числа с плавающей точкой, разделённые неким разделителем. Шаблон записи может выглядеть так:

^([0-9]{8})([a-zA-Z0-9]{6})([-+.0-9]+),([-+.0-9]+)$

Подобные записи будет непросто разделить на поля с использованием стандартных возможностей awk. Поэтому для разбора подобных записей приходится писать код самостоятельно.

Если в записях файла имеются единообразно оформленные поля, но при этом неизвестно их точное количество, тогда, возможно, имеет смысл воспользоваться FS или FPAT. Вот материал, в котором идёт речь об использовании FPAT при обработке HEX-файлов с помощью awk. В рассматриваемой библиотеке применяется немного другой подход. Её можно использовать для полного разбора строки на составные части. Например, часть строки может представлять собой поле фиксированной длины, после чего могут идти поля, для оформления которых используется множество различных разделителей. С помощью других методов обрабатывать подобные данные может быть довольно-таки непросто.

Регулярные выражения


Расскажу о функции gawk match. Эта функция, конечно, имеется и в обычном awk, но её возможности в gawk расширены, что упрощает её использование. Обычно эта функция выполняет поиск в строках с использованием регулярного выражения. Она сообщает о том, где начинается фрагмент строки, соответствующий регулярному выражению (если совпадение найдено), и о том, сколько именно символов строки соответствуют регулярному выражению.

В gawk этой функции можно передать дополнительный аргумент, представляющий собой массив. В него попадут некоторые сведения о результатах поиска. В частности, в нулевой элемент массива попадёт весь фрагмент строки, соответствующий регулярному выражению. Если регулярное выражение содержит, в круглых скобках, подвыражения, то они попадут в массив, пронумерованные в соответствии с порядком следования скобок. В массиве будут сведения о начале и о длине совпадений.

Например, пусть регулярное выражение выглядит так:

"^([0-9]+)([a-z]+)$"

Обрабатываемая строка выглядит так:

123abc

Массив будет содержать следующие данные:

array[0] - 123abcarray[1] - 123array[2] - abcarray[0start] - 1array[0length] - 6array[1start] - 1array[1length] - 3array[2start] - 4array[2length] - 3

Можно даже использовать вложенные выражения. Так, например, регулярное выражение вида ^(([xyz])[0-9]+)([a-z]+)$ при анализе строки z1x даст array[1]=z1, array[2]=z и array[3]=x.

Теория и практика


В теории это всё, что нужно. Можно писать регулярные выражения для разбора строк, а потом обращаться к отдельным элементам строки, пользуясь массивом. На практике же гораздо удобнее будет, если все подготовительные процедуры будут проведены заранее, что позволит работать с данными, используя обычные имена.

Вот пример строки, которую может понадобиться обработать:

11/10/2020 07:00 The Best of Bradbury, 14.95 *****

Здесь имеется дата в формате, принятом в США, время в 24-часовом формате, название товара, цена и рейтинг товара, который может выглядеть как последовательность из 1-5 звёздочек и, кроме того, может отсутствовать. Написание регулярного выражения, способного выделить из этой строки каждое интересующее нас поле, будет достаточно сложной, но решаемой задачей. Вот один из вариантов такого регулярного выражения:

"^(([01][0-9])/([0-3][0-9])/(2[01][0-9][0-9]))[[:space:]]*(([0-2][0-9]):([0-5][0-9]))[[:space:]]+([^,]+),[[:space:]]*([0-9.]+)[[:space:]]*([*]{1,5})?[[:space:]]*$"

Выглядит всё это, конечно, не очень, но с решением задачи справляется. Обратите внимание на то, что каждый интересующий нас элемент заключён в круглые скобки, и на то, что некоторые из таких конструкций вложены друг в друга. В результате, например, дата это поле, но месяц, день и год это тоже поля.

Библиотека, облегчающая работу с gawk


После того, как вы скачали файлы с GitHub, вы можете поместить функции с именами вида fields_* в свой код. В блоке BEGIN нужно выполнить некоторые настройки. Затем строки обрабатывают с помощью функции fields_process. Вот небольшой пример использования моей библиотеки (код самих функций из библиотеки опущен):

BEGIN {fields_setup("^(([01][0-9])/([0-3][0-9])/(2[01][0-9][0-9]))[[:space:]]*(([0-2][0-9]):([0-5][0-9]))[[:space:]]+([^,]+),   [[:space:]]*([0-9.]+)[[:space:]]*([*]{1,5})?[[:space:]]*$")fields_setupN(1,"date")fields_setupN(2,"month")fields_setupN(3,"day")fields_setupN(4,"year")fields_setupN(5,"time")fields_setupN(6,"hours")fields_setupN(7,"minutes")fields_setupN(8,"item")fields_setupN(9,"price")fields_setupN(10,"star")}{v=fields_process()... тут будет ваш код...}

В своём коде для обработки вышеприведённой строки вы можете воспользоваться, например, такой конструкцией:

cost=Fields_fields["price"] * 3

Как по мне, так это сильно упрощает работу. Функция fields_process возвращает false в том случае, если ей ничего не удалось найти. При этом, если нужно, можно работать с обычными awk-полями вроде $0 или $2.

Об устройстве предлагаемых функций


Мои функции основаны на двух механизмах. Во-первых это gawk-расширение функции match. Во-вторых это механизм ассоциативных массивов awk. Ранее я добавил именованные ключи к существующему массиву найденных совпадений. Поэтому к данным можно обращаться любым способом. Но я модифицировал массив, поэтому он является локальным, так как мне почти никогда не нужна эта возможность, и, таким образом, если понадобятся все данные из массива, нужно будет отфильтровать из него все дополнительные поля.

Часто имеет смысл начинать регулярное выражение с символа ^ и заканчивать символом $ для того чтобы ориентироваться на обработку всей строки. Главное не забывать о том, что регулярное выражение должно, как в примере, учитывать использование пробелов. Это часто бывает нужно в том случае, когда имеются поля, которые могут содержать пробелы. Но если надо, чтобы пробелы, в любом случае, играли роль символов-разделителей полей, то вам, возможно, лучше использовать стандартную схему разбора строк.

Ещё один интересный приём заключается в получении остатка строки всего того, что осталось после обработки первых полей. Сделать это можно, добавив в конец регулярного выражения конструкцию (.*)$. Главное не забудьте задать тег для этой конструкции, используя fields_setupN, что позже позволит обратиться к этим данным.

К моей библиотеке можно добавить простое расширение, которое превращает шаблон в массив шаблонов. Функция обработки строк может перебирать и испытывать элементы массива до тех пор, пока не найдёт совпадение с одним из них. Затем функция возвращает индекс сработавшего шаблона или false в том случае, если не найдено совпадения ни с одним шаблоном. Вероятно, при таком подходе нужно будет предусмотреть использование различных наборов тегов полей для каждого из шаблонов.

Пользуетесь ли вы gawk? Планируете ли применять функции, предложенные автором этого материала?



Подробнее..

Шпаргалка по Ansible k8s, практичный учебник по awk, а также 4 причины использовать Jamstack при веб-разработке

24.09.2020 14:19:46 | Автор: admin


Традиционно короткий дайджест полезных материалов, найденных нами в сети за последние две недели.

Начни новое:



Качай:


  • Шпаргалка по Ansible k8s
    Ansible k8s это специальный модуль для управления объектами Kubernetes из плейбуков Ansible. Как объединить Ansible и Kubernetes при автоматизации облака? Ответ: использовать модуль Ansible k8s, чтобы управлять объектами Kubernetes прямо из плейбуков. И поможет в этом наша шпаргалка, которая содержит полезные советы и сведения по ключевым командам этого модуля.
  • Шпаргалка по тестированию приложений Quarkus


  • Книжка-раскраска Контейнерные супергерои
    Децентрализованная команда опенсорсных контейнерных супергероев в лице Podman, CRI-O, Buildah, Skopeo и OpenShift спасает Землю от атаки астероидов, развертывая над планетой защитный экран.



Почитать на досуге:



Мероприятия:


  • 30 сентября, jconf.dev
    Бесплатная виртуальная Java-конференция прямо у вас на экране. Четыре технотрека с экспертами по Java и облаку, 28 углубленных сессий и два потрясающих основных доклада.
  • 13-14 октября, AnsibleFest
    Выступления, демонстрации, практические занятия и все это в онлайне. Отличная возможность виртуально пообщаться с девелоперами, админами и ЛПР-ами, которые успешно справляются с вызовами перемен с помощью опенсорсных технологий ИТ-автоматизации.

По-русски:


Мы продолжаем серию пятничных вебинаров про нативный опыт использования Red Hat OpenShift Container Platform и Kubernetes. Регистрируйтесь и приходите:

Император Оператор: Операторы в OpenShift и Kubernetes
Упс, вебинар прошел, но есть запись.

OpenShift-специфичные волшебные вещи для сборки и развертывания приложений
Вебинар кончился, но остался в истории ловите запись.

Подробнее..

Сборник полезных ссылок для системного администратора

14.08.2020 14:14:13 | Автор: admin


Сборник полезных ссылок для системного администратора, руководства, инструкции, учебные курсы, секреты-советы и многое другое ниже в нашем еженедельном посте.

Когда вы системный администратор, то отвечаете не за что-то одно, а сразу на всё. Причем горящие задачи частенько возникают самым внезапным образом. Если не заниматься чем-то каждый день, оно рано или поздно вылетает из головы, и вы просто не можете вспомнить нужные команды и опции именно в том момент, когда кругом всё горит и рушится. Поэтому мы подготовили 10 полезных шпаргалок, которые пригодятся вне зависимости от того, насколько вы крутой сисадмин:

  • Сети
    PDF-шпаргалка по утилитам и командам Linux для управления серверами и сетями.
  • Файрвол
    Эта шпаргалка поможет прокачать знания по безопасности Linux.
  • Продвинутый SSH
    Для большинства SSH это просто инструмент для удаленного входа. А на самом деле он может гораздо больше.
  • Пользователи и разрешения
    Здесь собраны примеры и команды, которые пригодятся при управлении пользователями и разрешениями.
  • Базовые команды
    Linux-команды для рутинных задач: навигация и управление файлами, установка софта на типовых дистрибутивах, сервисы.
  • Git
    Сегодня это де-факто стандарт управления версиями, пора научиться работать с ним эффективно.
  • Curl
    Типовые синтаксисы и сценарии применения утилиты curl, в том числе, как использовать ее для запроса API.
  • SELinux
    Полезное руководство по использованию и работе с Security-Enhanced Linux.
  • Kubectl
    9 важных команд kubectl для устранения неполадок и управления кластерами Kubernetes.
  • awk
    Памятка по типовым функциями awk.

Бонус: Bash-сценарии руководство для сисадминов



Эта электронная книга расскажет, почему shell-сценарии это лучший способ автоматизации задач, и научит создавать простые сценарии.

Почтовая рассылка Enable Sysadmin

Руководства, инструкции, учебные курсы, секреты-советы и многое другое.
Подробнее..

Procmeminfo gawk удобный JSON для discovery метрик в zabbix

04.12.2020 20:21:06 | Автор: admin

В работе над одной задачей, понадобилось добавить в мониторинг все счетчики памяти из /proc/meminfo с нескольких linux хостов, для отслеживания состояние памяти в течении времени

root@server:~# cat /proc/meminfo                MemTotal:        8139880 kBMemFree:          146344 kBMemAvailable:    4765352 kBBuffers:          115436 kBCached:          6791672 kBSwapCached:         9356 kBActive:          4743296 kBInactive:        2734088 kBActive(anon):    2410780 kBInactive(anon):   340628 kBActive(file):    2332516 kBInactive(file):  2393460 kBUnevictable:           0 kBMlocked:               0 kBSwapTotal:       3906556 kBSwapFree:        3585788 kBDirty:               804 kBWriteback:             0 kBAnonPages:        567172 kBMapped:          2294276 kBShmem:           2182128 kBKReclaimable:     198800 kBSlab:             340540 kBSReclaimable:     198800 kBSUnreclaim:       141740 kBKernelStack:        7008 kBPageTables:        90520 kBNFS_Unstable:          0 kBBounce:                0 kBWritebackTmp:          0 kBCommitLimit:     7976496 kBCommitted_AS:    5171488 kBVmallocTotal:   34359738367 kBVmallocUsed:       25780 kBVmallocChunk:          0 kBPercpu:            24480 kBHardwareCorrupted:     0 kBAnonHugePages:         0 kBShmemHugePages:        0 kBShmemPmdMapped:        0 kBFileHugePages:         0 kBFilePmdMapped:         0 kBCmaTotal:              0 kBCmaFree:               0 kBHugePages_Total:       0HugePages_Free:        0HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kBHugetlb:               0 kBDirectMap4k:      773632 kBDirectMap2M:     7606272 kBDirectMap1G:     2097152 kBroot@server:~#

Набор счетчиков должен приезжать в мониторинг автоматически при помощи discovery прямиком с файла /proc/meminfo

После разведки и создании метрик, все метрики должны приезжать в мониторинг раз в минуту одной операцией, для снижения эффекта наблюдения

Первое что пришло на ум - создать скрипт, запилить в нем всю логику, разложить на сервера и добавить юсер-параметр zabbix агента, но это уже не спортивно, так как эту же штуку можно сделать используя лишь gawk

Создадим шаблон в мониторинге, переходим во вкладку макросы, создаем три макроса:

макрос {$PATH} нужен для того чтобы gawk нашелся при попытке его запустить

Содержание макроса:

PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; LANG=en_US.UTF-8;

макрос {$S} нужен будет в discovery ( простыню про gawk, BEGIN я объясню в конце статьи )

gawk  'BEGIN {FS=":";ORS="";print "{\"data\": [ " }{b=gensub(/ +/,"","g",gensub(/kB/,"","g",$2) );$1=gensub(/\(|\)/,"_","g",$1);printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";} END { print " ]}" }' /proc/meminfo

макрос {$VALUE} нужен будет при получении метрик раз в минуту

gawk  'BEGIN { FS=":"; ORS = ""; print "{" } { b=gensub(/ +/,"","g",gensub(/kB/,"","g",$2) ); $1=gensub(/\(|\)/,"_","g",$1); printf "%s\"%s\":\"%s\"",separator,$1,b;separator=",";} END { print "}" }' /proc/meminfo

вот наш шаблон

Создадим обычную метрику meminfo system.run[{$PATH} {$VALUE},wait]

Обратите внимание на конструкцию вызова system.run а внутри два макроса {$PATH} {$VALUE} очень коротко, лаконично и удобно

Метрика meminfo является источником данных для метрик которые будут обнаружены

С метрикой пока все

Создаем правило обнаружения meminfo

Перейдем в фильтр и добавим {#TYPE} [не равно] VmallocTotal|VmallocChunk это делается для исключения двух ненужных нам параметров

Создаем прототип элемента данных, тип данных зависимый элемент, в качестве источника данных выбираем метрику созданную ранее

В пред-обработке настраиваем JSONPath + добавляем множитель так как цифры приезжают к килобайтах, а нужны в байтах.

Линкуем созданный шаблон с хостом

Пробуем

Должно получится

метрики нашлись, данные по ним распределились в правильном исчислении то есть в байтах

можем посмотреть и графики

Теперь самое интересное, как использовать gawk для создания JSON для discavery и для базовой метрики

Вот полный честный вывод JSON для discavery

root@server:~# gawk  'BEGIN {FS=":";ORS="";print "{\"data\": [ " }{b=gensub(/ +/,"","g",gensub(/kB/,"","g",$2) );$1=gensub(/\(|\)/,"_","g",$1);printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";} END { print " ]}" }' /proc/meminfo{"data": [ {"{#TYPE}": "MemTotal", "{#VALUE}": "8139880"},{"{#TYPE}": "MemFree", "{#VALUE}": "147628"},{"{#TYPE}": "MemAvailable", "{#VALUE}": "4764232"},{"{#TYPE}": "Buffers", "{#VALUE}": "115316"},{"{#TYPE}": "Cached", "{#VALUE}": "6789504"},{"{#TYPE}": "SwapCached", "{#VALUE}": "9356"},{"{#TYPE}": "Active", "{#VALUE}": "4742408"},{"{#TYPE}": "Inactive", "{#VALUE}": "2733636"},{"{#TYPE}": "Active_anon_", "{#VALUE}": "2411644"},{"{#TYPE}": "Inactive_anon_", "{#VALUE}": "340828"},{"{#TYPE}": "Active_file_", "{#VALUE}": "2330764"},{"{#TYPE}": "Inactive_file_", "{#VALUE}": "2392808"},{"{#TYPE}": "Unevictable", "{#VALUE}": "0"},{"{#TYPE}": "Mlocked", "{#VALUE}": "0"},{"{#TYPE}": "SwapTotal", "{#VALUE}": "3906556"},{"{#TYPE}": "SwapFree", "{#VALUE}": "3585788"},{"{#TYPE}": "Dirty", "{#VALUE}": "368"},{"{#TYPE}": "Writeback", "{#VALUE}": "0"},{"{#TYPE}": "AnonPages", "{#VALUE}": "568164"},{"{#TYPE}": "Mapped", "{#VALUE}": "2294960"},{"{#TYPE}": "Shmem", "{#VALUE}": "2182128"},{"{#TYPE}": "KReclaimable", "{#VALUE}": "198800"},{"{#TYPE}": "Slab", "{#VALUE}": "340536"},{"{#TYPE}": "SReclaimable", "{#VALUE}": "198800"},{"{#TYPE}": "SUnreclaim", "{#VALUE}": "141736"},{"{#TYPE}": "KernelStack", "{#VALUE}": "7040"},{"{#TYPE}": "PageTables", "{#VALUE}": "90568"},{"{#TYPE}": "NFS_Unstable", "{#VALUE}": "0"},{"{#TYPE}": "Bounce", "{#VALUE}": "0"},{"{#TYPE}": "WritebackTmp", "{#VALUE}": "0"},{"{#TYPE}": "CommitLimit", "{#VALUE}": "7976496"},{"{#TYPE}": "Committed_AS", "{#VALUE}": "5189180"},{"{#TYPE}": "VmallocTotal", "{#VALUE}": "34359738367"},{"{#TYPE}": "VmallocUsed", "{#VALUE}": "25780"},{"{#TYPE}": "VmallocChunk", "{#VALUE}": "0"},{"{#TYPE}": "Percpu", "{#VALUE}": "24480"},{"{#TYPE}": "HardwareCorrupted", "{#VALUE}": "0"},{"{#TYPE}": "AnonHugePages", "{#VALUE}": "0"},{"{#TYPE}": "ShmemHugePages", "{#VALUE}": "0"},{"{#TYPE}": "ShmemPmdMapped", "{#VALUE}": "0"},{"{#TYPE}": "FileHugePages", "{#VALUE}": "0"},{"{#TYPE}": "FilePmdMapped", "{#VALUE}": "0"},{"{#TYPE}": "CmaTotal", "{#VALUE}": "0"},{"{#TYPE}": "CmaFree", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Total", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Free", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Rsvd", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Surp", "{#VALUE}": "0"},{"{#TYPE}": "Hugepagesize", "{#VALUE}": "2048"},{"{#TYPE}": "Hugetlb", "{#VALUE}": "0"},{"{#TYPE}": "DirectMap4k", "{#VALUE}": "773632"},{"{#TYPE}": "DirectMap2M", "{#VALUE}": "7606272"},{"{#TYPE}": "DirectMap1G", "{#VALUE}": "2097152"} ]}root@server:~#

Вот так выглядит JSON для discavery

{"data": [ {"{#TYPE}": "MemTotal", "{#VALUE}": "8139880"},{"{#TYPE}": "MemFree", "{#VALUE}": "147628"},{"{#TYPE}": "MemAvailable", "{#VALUE}": "4764232"},{"{#TYPE}": "Buffers", "{#VALUE}": "115316"},{"{#TYPE}": "Cached", "{#VALUE}": "6789504"},{"{#TYPE}": "SwapCached", "{#VALUE}": "9356"},.....{"{#TYPE}": "DirectMap4k", "{#VALUE}": "773632"},{"{#TYPE}": "DirectMap2M", "{#VALUE}": "7606272"},{"{#TYPE}": "DirectMap1G", "{#VALUE}": "2097152"} ]}root@server:~# 
root@server:~# gawk 'BEGIN {FS=":";ORS="";print "{\"data\": [ " }{b = gensub(/ +/,"","g",  gensub(/kB/,"","g",$2) );$1=gensub(/\(|\)/,"_","g",$1);printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";}END { print " ]}" }' /proc/meminfo

BEGIN {FS=":";ORS="";print "{\"data\": [ " }

FS=":"; - разделяет строку на части и передает разделившеся части в $1, $2 ... $n

print "{\"data\": [ " - выполняется только один раз, в самом начале

Дальше происходит магия gawk организует сам цикл с перечислением всех полученных строк, принимая во внимание то что строки будут разделятся по ":" то мы в $1 получать всегда имя параметра, а в $2 всегда его значение, правда не очень в удобном формате

собственно это выглядит как: есть строка из цикла CommitLimit: 7976496 kB которая разделяется:

$1=CommitLimit

$2= 7976496 kB

Нужно предобработать обе строки

b = gensub(/ +/,"","g", gensub(/kB/,"","g",$2) ); содержится две функции gensub

Вложенная функция gensub(/kB/,"","g",$2) исключает из вывода kB а базовая gensub(/ +/,"","g", ........ ); исключает пробелы, получаем чистую цифиру.

Следом в имени параметров {#TYPE} нужно предусмотреть что недолжно быть символов скобок ( ) так как мониторинг их не перевариват, ни при создании метрик, ни при разнесении данных.

Сказанно - сделано, регуляркой уберем скобки из имени параметра, заменим поджопником нижней чертой _ $1=gensub(/\(|\)/,"_","g",$1);

После подготовленные параметры, собираем JSON и выводим

printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";}

После того как все строки обработаны, gawk выполняет END { print " ]}" что закрывает JSON и финализирует.

Вот таким простым способом без скриптов можно сделать обнаружения и формирование JSON с данными, добавив метрики в мониторинг и получая максимальный эффект от простоты применения.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru