Листинг 10.3.Сценарий searchinfo
··#!/bin/bash
··# searchinfo — извлекает и анализирует трафик поисковых систем, указанных
··#·· в поле с информацией о ссылающихся доменах, в обобщенном формате
··#·· журналирования.
··host="intuitive.com"·· # Замените именем своего домена.
··maxmatches=20
··count=0
··temp="/tmp/$(basename $0).$$"
··trap "$(which rm) −f $temp" 0
··if [$# −eq 0]; then
····echo "Usage: $(basename $0) logfile" >&2
····exit 1
··fi
··if [! -r "$1"]; then
····echo "Error: can't open file $1 for analysis." >&2
····exit 1
··fi
··for URL in $(awk '{ if (length($11) > 4) { print $11 } }' "$1" | \
····grep −vE "(/www.$host|/$host)" | grep '?')
··do
····searchengine="$(echo $URL | cut −f— f3 | rev | cut −d. -f1-2 | rev)"
····args="$(echo $URL | cut −d\? -f2 | tr '&' '\n' | \
······grep −E '(^q=|^sid=|^p=|query=|item=|ask=|name=|topic=)' | \
······sed −e 's/+/ /g' −e 's/%20/ /g' −e 's/"//g' | cut −d= −f2)"
····if [! -z "$args"]; then
······echo "${searchengine}: $args" >> $temp
····else
······# Запрос неизвестного формата, показать всю строку GET…
······echo "${searchengine} $(echo $URL | cut −d\? -f2)" >> $temp
····fi
····count="$(($count + 1))"
··done
··echo "Search engine referrer info extracted from ${1}:"
··sort $temp | uniq −c | sort −rn | head −$maxmatches | sed 's/^/ /g'
··echo ""
··echo Scanned $count entries in log file out of $(wc −l < "$1") total.
··exit 0
Главный цикл for
в этом сценарии извлекает все записи из файла журнала, имеющие допустимое значение в поле со ссылающимся доменом: строку длиной более четырех символов, не совпадающую с содержимым переменной $host и знаком вопроса (?), указывающим, что пользователь выполнял поиск.
Далее сценарий пытается идентифицировать имя ссылающегося домена и строку поиска, введенную пользователем
. Исследования сотен поисковых запросов показывают, что типичные поисковые сайты используют небольшое количество переменных с известными именами. Например, в случае с Yahoo! строка поиска будет содержать переменную со строкой поиска p= шаблон . Google и MSN используют переменную с именем q. Команда grep проверяет присутствие p, q и других распространенных имен поисковых переменных.
Команда sed
очищает извлеченные строки поиска, замещая + и %20 пробелами и убирая кавычки, а команда cut возвращает все, что следует за первым знаком «равно». Иными словами, код возвращает только искомую строку, которую ввел пользователь.
Условный блок, следующий сразу за этими строками, проверяет переменную args. Если она ничего не содержит (то есть если запрос имеет неизвестный формат) — использовалась неизвестная нам поисковая система, поэтому выводится весь запрос целиком, а не только искомая строка.
Чтобы запустить этот сценарий, просто передайте ему единственный аргумент с именем файла журнала Apache или другого веб-сервера, поддерживающего обобщенный формат журналирования (листинг 10.4).
ПРИМЕЧАНИЕ
Это один из самых медленных сценариев в данной книге, потому что он запускает много подоболочек для выполнения разных задач. Не удивляйтесь, если его работа потребует значительного времени.
Листинг 10.4.Результаты обработки журнала access_log веб-сервера Apache с помощью searchinfo
$ searchinfo /web/logs/intuitive/access_log
Search engine referrer info extracted from access_log:
······771
········4 online reputation management akado
········4 Names Hawaiian Flowers
········3 norvegian star
········3 disneyland pirates of the caribbean
········3 disney california adventure
········3 colorado railroad
········3 Cirque Du Soleil Masks
········2 www.baskerballcamp.com
········2 o logo
········2 hawaiian flowers
········2 disneyland pictures pirates of the caribbean
········2 cirque
········2 cirqu
········2 Voil%C3%A0 le %3Cb%3Elogo du Cirque du Soleil%3C%2Fb%3E%21
········2 Tropical Flowers Pictures and Names
········2 Hawaiian Flowers
········2 Hawaii Waterfalls
········2 Downtown Disney Map Anaheim
Scanned 983 entries in log file out of 7839 total.
Усовершенствование сценария
Читать дальше