Выбрать главу

··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.

Усовершенствование сценария

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

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

for URL in $(awk '{ if (length($11) > 4) { print $11 } }' "$1" | \

··grep $2)

do

··args="$(echo $URL | cut −d\? -f2 | tr '&' '\n' | \

······grep −E '(^q=|^sid=|^p=|query=|item=|ask=|name=|topic=)' | \

······cut −d= −f2)"

··echo $args | sed −e 's/+/ /g' −e 's/"//g' >> $temp

··count="$(($count + 1))"

done

В этом случае также следует дополнить сообщение с инструкцией о порядке использования, упомянув в нем второй аргумент. И снова в конечном счете сценарий будет выводить пустые данные из-за изменений в отношении к заголовку Referer со стороны разработчиков веб-браузеров и компании Google в особенности. Как можно видеть в примере выше, в исследованном файле журнала найдена 771 запись, не имеющая сведений о ссылающемся домене и поэтому не содержащая полезной информации о строке поиска.

№ 75. Исследование журнала error_log веб-сервера Apache

Так же как сценарий № 73 извлекает интересную и полезную статистическую информацию из файла журнала access_log веб-сервера Apache или совместимого с ним, этот сценарий извлекает чрезвычайно важные сведения из файла журнала error_log.