Статистика из логов Apache и nginx средствами коммандной строки linux

Вы даже не представляете как много информации можно вытащить из классического combined лога apache-а или nginx-а стандартными средствами коммандной строки.

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

Приступим, мы имеем в своём распоряжении лог-файл содержащий примерно такие строки:

195.189.142.153 - - [06/Jul/2009:22:09:27 +0400] "GET /css/main.css HTTP/1.1"
200 1912 "http://example.ru/main" "Opera/8.01"

Например, мы хотим выяснить наиболее популярные запросы за сегодняшний день, для этого выполним:

grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | sort | uniq -c | sort

разберём комманду на составляющие:

grep "06/Jul" /var/log/nginx/access.log

Отбирает из лог-файла /var/log/nginx/access.log строки, в которых встречается “06/Jul” - таким образом мы отфильтровываем только сегодняшние запросы

cut -d \" -f 2

Обрабатывает множество строк “выдёргивая” из каждой 2-й столбец (ключ -f с параметром 2) с учетом того что разделителем столбцов является символ ” (ключ -d с параметром \”, слеш экранирует кавычку “защищая” её от коммандного интерпретатора). То есть для приведённого выше примера это подстрока GET /css/main.css HTTP/1.1

sort

Сортирует строки, это необходимо для корректной работы следующей комманды

uniq -c

Отображает только уникальные записи, ключ -c заставляет комманду выводить перед каждой строкой количество её повторений.

Подобным запросом можно получить список популярных запросов без учета типа запросов (GET, POST, OPTIONS, HEAD и т.д.)

grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | cut -d ' ' -f 2
| sort | uniq -c | sort

Типы запросов:

grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | cut -d ' ' -f 1
| sort | uniq -c | sort

Или же версию HTTP протокола:

grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 2 | cut -d ' ' -f 3
| sort | uniq -c | sort

Обращаю внимание на то, что второй вызов команды cut оперирует с результатом выполнения первой команды cut, вычленяя столбцы из строк вида GET /css/main.css HTTP/1.1. При этом в качестве разделителя используется пробел, для передачи пробела в качестве разделителя команде cut необходимо заключить его в одинарные кавычки.

Идём дальше, получим список активных пользователей, приняв для простоты что 1 ip адрес = 1 пользователь

grep "06/Jul" /var/log/nginx/access.log | cut -d ' ' -f 1 | sort
| uniq -c | sort

Количество уникальных пользователей

grep "06/Jul" /var/log/nginx/access.log | cut -d ' ' -f 1 | sort
| uniq | wc -l

В последнем примере появилясь новая команда

wc -l

Команда wc позволяет посчитать количество строк, слов и символов в каком либо файле или потоке ввода. Ключ -l указвает что необходимо посчитать и отобразить только количество строк.

И на последок тяжёлая артиллерия:
Почасовая динамика количества запросов

grep "06/Jul" /var/log/nginx/access.log | cut -d [ -f 2 | cut -d ] -f 1
| cut -d : -f 1,2 | uniq -c

Три подряд идущих оператора cut позволяют оставить в наборе строк только дату и час, uniq -c оставляет уникальные строки и считает их количество. Оператор sort не применяется поскольку дата/время в лог файле и так записываются в порядке возрастния (машину времени пока еще не изобрели ;) )
Отданный траффик.

grep "06/Jul" /var/log/nginx/access.log | cut -d \" -f 3 | cut -c 6-
| awk '{ s += $1 } END { print s }'

Этот пример пожалуй оставлю без комментариев, т.к. для полноценного описания работы awk одной заметки явно мало, да честно говоря я пока и не готов подробно рассказать что там и к чему.
(Скопировано с сайта http://grezz.ru/?p=164)