Исключить определенных ботов при сортировке логов сервера Apache - PullRequest
0 голосов
/ 16 октября 2018

У меня есть сценарий bash, который сортирует наибольшее число попаданий в журналах сервера и печатает IP-адрес и пользовательский агент:

cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | sort -n | uniq -c | sort -nr | head -30

Он выводит результат, подобный следующему:

COUNT   IP Address  User Agent

37586  66.249.73.223  "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
23960  84.132.153.226  "-" <--- I do need to see things like this
13246  17.58.103.219  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Applebot/0.1; +http://www.apple.com/go/applebot)" <--- But not this
10572  66.249.90.191  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246 Mozilla/5.0"
 9505  66.249.73.223  "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
 5157  66.249.73.193  "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Меня не интересуют такие боты, как Googlebot, Bingbot, Applebot и т. Д. Есть ли способ получить такой же формат, кроме этих дружелюбных ботов?

Я могу исключить робота Google с:

cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -v "Googlebot" | sort -n | uniq -c | sort -nr | head -30

Но я бы хотел исключить несколько ботов.

Я также сделал:

cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -v "Googlebot" | grep -v "bingbot" | grep -v "Applebot" | sort -n | uniq -c | sort -nr | head -30

, который, кажется, работает, но правильный ли это синтаксис bash для передачи нескольких greps?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы также можете использовать grep -F -v -e <phrase1> -e <phrase2> ... -e <phraseN>, как показано ниже:

cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -F -v -e "Googlebot" -e "bingbot" -e "Applebot" | sort -n | uniq -c | sort -nr | head -30

-F указывает grep обрабатывать строки поиска как фиксированную строку ... обычно это много быстрее, чем использование регулярных выражений

-e позволяет указать выражение.Использование нескольких -e флагов позволяет объединять несколько выражений для использования в одной команде grep.

В качестве альтернативы, вы можете использовать файл «черного списка» и делать что-то вроде следующего:

cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -F -f blacklist.txt -v | sort -n | uniq -c | sort -nr | head -30

где содержимое blacklist.txt:

Applebot
Googlebot
bingbot

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

edit : Вы также можете переместить аргумент -r на свой первый sort и вообще избежать второго вызова.Кроме того, поскольку вы используете awk, вы можете полностью избавиться от grep (учтите, что за счет использования регулярных выражений, но поскольку уже обрабатывает каждую строку в файле, вы можете сохранить большевремя на ввод / вывод):

cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '!/Applebot|Googlebot|bingbot/{print $5 $11}' | sort -nr | uniq -c | head -30

Я бы также предложил избавиться от ведущего кота, потому что awk откроет файл для чтения без изменений (если вы не скажете ему изменить файл):

awk -F'|' '!/Applebot|Googlebot|bingbot/{print $5 $11}' /var/log/apache2/proxy.example.com.access.log | sort -nr | uniq -c | head -30

и, поскольку вы знаете расположение полей, вы также можете использовать sed, что будет быстрее, чем awk ... Я оставляю это в качестве упражнения для читателя (простоимейте в виду, что индексированные результаты поиска: ls | sed -n 's/\(.*\)\.txt/\1/p' приводит к тому, что все файлы '* .txt' распечатываются без их расширения)

0 голосов
/ 16 октября 2018

Я нашел гораздо более чистый способ сделать это вместо нескольких «grep -v».Я использовал egrep:

cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | egrep -v "Googlebot|bingbot|Applebot" | sort -n | uniq -c | sort -nr | head -30

Если у кого-то нет лучшего способа, это прекрасно работает для меня.

...