Skip to content

Instantly share code, notes, and snippets.

@vkostyanetsky
Created October 17, 2020 10:42
Show Gist options
  • Save vkostyanetsky/47e02e199bb32082c4d5019ca88233c0 to your computer and use it in GitHub Desktop.
Save vkostyanetsky/47e02e199bb32082c4d5019ca88233c0 to your computer and use it in GitHub Desktop.
TopExceptions.sh, v1
# Описания и контексты ошибок содержат символ перевода строки. То есть по нему нельзя определить,
# где заканчивается одна запись и начинается другая.
#
# Однако в начале каждой записи есть время события; заменим его на маркер <NL> (New Line).
#
cat rphost_*/*.log |
sed -r 's/[0-9]+:[0-9]+.[0-9]+-/<NL>/' |
# Теперь можно расклеить текст по этому маркеру и собрать статистику по ошибками. В качестве разделителя
# для утилиты gawk используем вводную конструкцию параметра Descr — описание ошибки платформа выводит
# сразу после неё.
#
gawk -F'Descr=' -vRS='<NL>' '{if ($2!~/^$/) errors[$2]+=1}END{for (i in errors) print "<NL>" errors[i] " " i}' |
# Заменяем пробельные символы на пробелы, удаляем пустые строки.
#
sed -r 's/\s/ /g' |
sed -r /^$/d |
# Ошибки нужно отсортировать по частотности. Для этого подходит утилита sort, но сперва нужно добиться того,
# чтобы в начале каждой строки с ошибкой стояло количество ее воспроизведений. Просто заменить <NL>
# на переводы строк нельзя, так как описания ошибок по-прежнему содержат переводы строк.
#
# Поэтому сначала заменяем переводы строк в описаниях на маркер @; получится что-то вроде:
#
# <NL>1 error1@something1<NL>8 error2@something2<NL>4 error3@something3
#
tr '\n' '@' |
# Теперь можно заменить <NL> на переводы строк, получив примерно такую картину:
#
# 1 error1@something1
# 8 error2@something2
# 4 error3@something3
#
sed -r 's/<NL>/\n/g' |
# Сортируем, берем первую 1K результатов и выводим. Перед выводом заменяем @ обратно — на перевод строки.
# Получится так:
#
# 8 error2
# something2
# 4 error3
# something3
# 1 error1
# something1
#
sort -rnb |
head -n 1000 |
sed -r 's/@/\n/g' > ExceptionsTop.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment