пятница, 7 декабря 2012 г.

AWK для анализа логов нагрузочного тестирования

AWK для анализа логов нагрузочного тестирования

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

Небольшой tutorial по awk.

Поля

Каждая сканируемая строка input рассматривается как состоящая из полей, разделенных разделительными символами (по умолчанию - пробел). На поля можно ссылаться из AWK программы следующим образом:
  1. $1 - Первое поле;
  2. $2 - Второе поле;
  3. ... и так далее...
  4. $0 - Ссылается на всю строку целиком.
Строка может содержать максимально до 100 полей.

 Значения переменных

Переменные могут интерпретироваться как числовые или строковые. В общем то в awk динамическая типизация.

Переменные поля

Ссылки на поля $1, $2, ... могут интерпретироваться в качестве переменных, например: $1 = "3" + $2 - первое поле принимает значение второго поля, увеличенного на 3.
$(i+1) - интерпретируется как поле, номер которого зависит от значения переменной i.

Массивы

Допускается использование массивов. Массивы не объявляются, а принимают значения из контекста, например: x[NR] = $0 - элементу массива x, индексированному NR, присваивается обрабатываемая строка.

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

 Для осуществление поиска в AWK языке допускается использование регулярных выражений, определенных в описании SED, заключенных в``/ /''. Дополнения к использованию регулярных выражений, допускаемые в AWK-языке:
  • "( )" - Скобки допускаются для группирования;
  • " |" - Указание альтернативы "или";
  • " + " - Плюс, стоящий за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 1;
  • " ? " - Знак вопроса за регулярным выражением означает 0 или 1 вхождений этого выражения;
  • [A-Z] - Допускается сокращенная форма записи для рангов ASCII символов;
  • Установленный порядок выполнения операторов на одном скобочном уровне: "[] * + ? конкатенация |".
Например:
/Olga/ - Указывает на строки, содержащие Olga.
/number[0-9]/ - Указывает на строки, содержащие number0 или number1 или ... number9.

Встроенные функции

length(arg) - Функция длины arg. Если arg не указан, то выдает длину текущей строки.
exp(),log(),sqrt() - Математические функции экспонента, логарифм и квадратный корень.
int() - Функция целой части числа.
substr(s,m,n) - Возвращает подстроку строки s, начиная с позиции m, всего n символов.
index(s,t) - Возвращает начальную позицию подстроки t в строке s. (Или 0, если t в s не содержится.)
sprintf(fmt,exp1,exp2,...) - Осуществляет форматированную печать (вывод) в строку, идентично PRINTF.
split(s,array,sep) - Помещает поля строки s в массив array и возвращает число заполненных элементов массива. Если указан sep, то при анализе строки он понимается как разделитель.

Управляющие структуры

Условное предложение: if ( &lt условие&gt ) &lt предложение&gt
\hskip 1cm [else &lt предложение&gt ]
Предложения цикла:
while ( &lt условие&gt ) &lt предложение&gt
for (&lt выражение&gt ; &lt условие&gt ; &lt выражение&gt )
\hskip 1cm &lt предложение&gt
Например:
for(i=1; i&lt =NF; i++) - Аналогично циклу for в языке ``С''
for (i in array) - Цикл по элементам массива. Но, элементы массива доступны в этом случае в случайном порядке.
break - Немедленный выход из цикла.
continue - Переход к выполнению следующего предложения.
next - Немедленный переход к анализу следующей строки.
exit - Выход из программы (на конец input).
# - Комментарий

И несколько полезных примеров для нагрузочного:

Считаем количество хитов и хостов за час по access

Хиты:
Если реферер не пустой и HTTP=200 тогда считаем.

cat access.log | grep '01/Jun/2011:10:' | grep ' 200 ' | awk '{ if ( $11 != "\"-\"" ) print }' | wc -l

Хосты:
cat access.log | grep '01/Jun/2011:10:' | grep ' 200 ' | awk '{ if ( $11 != "\"-\"" ) print $1}' | uniq | wc -l

в list.txt будет список айпи отсортированный по кол-ву обращений.
просматриваете, находите кто чаще всего обращался к апачу.
cat access.log | awk ' {print $1 }' | sort | uniq -c | sort -nr > list.txt

Комментариев нет:

Отправить комментарий