У меня есть файл журнала nginx, и я хочу узнать долю рынка для каждой основной версии браузеров. Меня не интересуют минорные версии и операционные системы. Хотелось бы получить примерно такое:
100 IE6
99 IE7
20 IE8
200 FF2
300 FF3
Я знаю, как получить список пользовательских агентов из файла, но я хочу агрегировать список, чтобы увидеть только основные версии браузеров. Есть ли инструмент, который это делает?
awk -F'"' '/GET/ {print $6}' /var/log/nginx-access.log | cut -d' ' -f1 | sort | uniq -c | sort -rn
awk(1)
- выбор полной строки User-Agent запросов GETcut(1)
- используя первое слово из негоsort(1)
- сортировкаuniq(1)
- считатьsort(1)
- сортировка по количеству, обратнаяPS. Конечно можно заменить на один awk
/sed
/perl
/python
/ etc скрипт. Я просто хотел показать, насколько богат unix-way.
В то время один лайнер от SaveTheRbtz выполняет свою работу, на разбор моего nginx
журнал доступа.
Вот более быстрая версия на его основе, которая занимает менее 1 минуты на 100 МБ файла журнала (что соответствует примерно 1 миллиону строк):
sed -n 's!.* "GET.* "\([[:alnum:].]\+/*[[:digit:].]*\)[^"]*"$!\1!p' /var/log/nginx/access.log | sort | uniq -c | sort -rfg
Он работает с форматом журнала доступа по умолчанию: nginx
, что совпадает с combined
формат Apache httpd
и имеет User-Agent
в качестве последнего поля, разделенного "
.
Это небольшой вариант принятого ответа с использованием fgrep
и cut
.
cat your_file.log | fgrep '"GET ' | cut -d'"' -f6 | cut -d' ' -f1 | sort | uniq -c | sort -rn
Есть что-то привлекательное в использовании «более слабых» команд, когда это возможно.
Awstats должен сделать свое дело, но предоставит гораздо больше информации. Надеюсь, это поможет...
Webalizer может это сделать.
Пример:
webalizer -o reports_folder -M 5 log_file
-o reports_folder
указывает папку, в которой создается отчет-M 5
отображает только имя браузера и основной номер версииlog_file
указывает имя файла журналаЧтобы получить пользовательский агент
sudo awk -F"\"" '{print $6}' /var/log/nginx/access.log | sort | uniq -dc
Я бы использовал для этого сценарий оболочки: cat, awk pipe, sort и uniq сделают эту работу