Код
Листинг 10.1. Сценарий webaccess
··#!/bin/bash
··# webaccess — анализирует файл журнала access_log в формате веб-сервера
··#·· Apache, извлекая полезную и интересную статистическую информацию.
··bytes_in_gb=1048576
··# Измените следующую переменную, чтобы она соответствовала имени хоста
··#·· вашего веб-сервера, чтобы отфильтровать запросы, обусловленные
··#·· внутренними переходами, при анализе ссылающихся доменов.
··host="intuitive.com"
··if [$# −eq 0]; then
····echo "Usage: $(basename $0) logfile" >&2
····exit 1
··fi
··if [! -r "$1"]; then
····echo "Error: log file $1 not found." >&2
····exit 1
··fi
firstdate="$(head -1 "$1" | awk '{print $4}' | sed 's/\[//')"
··lastdate="$(tail -1 "$1" | awk '{print $4}' | sed 's/\[//')"
··echo "Results of analyzing log file $1"
··echo ""
··echo " Start date: $(echo $firstdate|sed 's/:/ at /')"
··echo " End date: $(echo $lastdate|sed 's/:/ at /')"
··hits="$(wc −l < "$1" | sed 's/[^[: digit: ]]//g')"
··echo "········ Hits: $(nicenumber $hits) (total accesses)"
··pages="$(grep −ivE '(.gif|.jpg|.png)' "$1" | wc −l | sed 's/[^[: digit: ]]//g')"
··echo "·· Pageviews: $(nicenumber $pages) (hits minus graphics)"
··totalbytes="$(awk '{sum+=$10} END {print sum}' "$1")"
··/bin/echo −n " Transferred: $(nicenumber $totalbytes) bytes "
··if [$totalbytes −gt $bytes_in_gb]; then
····echo "($(scriptbc $totalbytes / $bytes_in_gb) GB)"
··elif [$totalbytes −gt 1024]; then
····echo "($(scriptbc $totalbytes / 1024) MB)"
··else
····echo ""
··fi
··# Теперь выберем из журнала некоторые полезные данные.
··echo ""
··echo "The 10 most popular pages were: "
··awk '{print $7}' "$1" | grep −ivE '(.gif|.jpg|.png)' | \
···· sed 's/\/$//g' | sort | \
···· uniq −c | sort −rn | head -10
··echo ""
··echo "The 10 most common referrer URLs were: "
··awk '{print $11}' "$1" | \
····grep −vE "(^\"-\"$|/www.$host|/$host)" | \
····sort | uniq −c | sort −rn | head -10
··echo ""
··exit 0
Как это работает
Рассмотрим каждый блок как отдельный небольшой сценарий. Например, первые несколько строк извлекают начальную и конечную дату (переменные firstdate и lastdate) , просто читая четвертое поле в первой и последней строках в файле. Количество посещений определяется подсчетом строк в файле с помощью wc
, а количество просмотренных страниц — как разность посещений и запросов файлов изображений (то есть файлов с расширениями .gif, jpg и .png). Общее количество отправленных байтов определяется как сумма значений десятого поля во всех строках, которая затем обрабатывается сценарием nicenumber для удобочитаемости.
Чтобы выяснить, какие страницы наиболее популярны, сначала из журнала извлекаются запрошенные страницы, и из их числа исключаются все файлы изображений . Далее вызывается команда uniq −c для сортировки и определения числа вхождений каждой уникальной записи. В финале выполняется еще одна сортировка, чтобы страницы с наибольшим количеством вхождений оказались в начале списка. Вся эта процедура выполняется строкой
.
Обратите внимание, как попутно выполняется нормализация: команда sed отсекает завершающие символы слеша, чтобы имена, такие как /subdir/ и /subdir, воспринимались как одно и то же.
Аналогично разделу, извлекающему десяток наиболее популярных страниц, раздел извлекает информацию о ссылающихся доменах.
Этот блок извлекает из журнала значение поля 11, отфильтровывает записи, относящиеся к текущему хосту, а также содержащие "-" (значение, передаваемое веб-браузерами, в которых включена блокировка передачи ссылочной информации). Полученные результаты передаются той же последовательности команд −sort|uniq −c|sort −rn|head -10, чтобы получить десяток самых активных ссылающихся доменов.
Запуск сценария
Чтобы запустить этот сценарий, передайте ему единственный аргумент с именем файла журнала Apache (или другого веб-сервера, поддерживающего обобщенный формат журналирования).
Результаты
Результаты обработки этим сценарием типичного файла журнала содержат много полезной информации, как можно видеть в листинге 10.2.
Листинг 10.2. Результаты обработки журнала access_log веб-сервера Apache с помощью webaccess