Grepping логи для IP-адресов - PullRequest
6 голосов
/ 20 апреля 2011

Я довольно плохо использую "basic?"Unix команды, и этот вопрос еще больше проверяет мои знания.То, что я хотел бы сделать, это grep всех IP-адресов из журнала (например, access.log из apache) и подсчитать, как часто они происходят.Могу ли я сделать это с помощью одной команды или мне нужно написать скрипт для этого?

Ответы [ 7 ]

13 голосов
/ 20 апреля 2011

Вам понадобится как минимум короткий конвейер.

sed -e 's/\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/' -e t -e d access.log | sort | uniq -c

, который будет печатать каждый IP (будет работать только с ipv4, хотя), отсортированный с префиксом count.это с apache2 access.log (хотя это настраивается, так что вам нужно будет проверить), и это сработало для меня.Предполагается, что IP-адрес является первым в каждой строке.

Sed собирает IP-адреса (на самом деле он ищет 4 набора цифр с точками между ними) и заменяет всю строку им.,-e t переходит к следующей строке, если ей удалось выполнить замену, -e d удаляет строку (если на ней не было IP-адреса).sort сортирует .. :) И uniq -c считает экземпляры последовательных идентичных строк (что, поскольку мы отсортировали их, соответствует общему количеству).

3 голосов
/ 12 июля 2018

Ни один из представленных здесь ответов не работал для меня, так что вот рабочий:

cat yourlogs.txt | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort | uniq -c | sort

он использует grep для изоляции всех ips.затем сортирует их, считает их и снова сортирует результат.

2 голосов
/ 20 апреля 2011

вы можете сделать следующее (где datafile - это имя файла журнала)

egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' datafile | sort | uniq -c

edit: пропущена часть о подсчете адресов, теперь добавлено

0 голосов
/ 26 марта 2014
cat access.log |egrep -o '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' |uniq -c|sort
0 голосов
/ 17 ноября 2013

Ниже приведен сценарий, который я написал несколько лет назад.Он извлекает адреса из журналов доступа Apache.Я только что попробовал запустить Ubuntu 11.10 (oneiric) 3.0.0-32-generic # 51-Ubuntu SMP Чт 21 марта 15:51:26 UTC 2013 i686 i686 i386 GNU / Linux Работает нормально.Используйте Gvim или Vim для чтения полученного файла, который будет называться unique_visits, в котором будут перечислены уникальные ips в столбце.Ключ к этому в строках, используемых с grep.Эти выражения работают для извлечения номеров IP-адресов.Только IPV4.Возможно, вам придется пройти и обновить номера версий браузера.Другой подобный скрипт, который я написал для системы Slackware, находится здесь: http://www.perpetualpc.net/srtd_bkmrk.html

#!/bin/sh
#eliminate search engine referals and zombie hunters. combined_log is the original file
egrep '(google)|(yahoo)|(mamma)|(query)|(msn)|(ask.com)|(search)|(altavista)|(images.google)|(xb1)|(cmd.exe)|(trexmod)|(robots.txt)|(copernic.com)|(POST)' combined_log > search
#now sort them to eliminate duplicates and put them in order
sort -un search > search_sort
#do the same with original file
sort -un combined_log > combined_log_sort
#now get all the ip addresses. only the numbers
grep -o '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' search_sort > search_sort_ip
grep -o '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' combined_log_sort > combined_log_sort_ip
sdiff -s combined_log_sort_ip search_sort_ip > final_result_ip
#get rid of the extra column
grep -o '^\|[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' final_result_ip > bookmarked_ip
#remove stuff like browser versions and system versions
egrep -v '(4.4.2.0)|(1.6.3.1)|(0.9.2.1)|(4.0.0.42)|(4.1.8.0)|(1.305.2.109)|(1.305.2.12)|(0.0.43.45)|(5.0.0.0)|(1.6.2.0)|(4.4.5.0)|(1.305.2.137)|(4.3.5.0)|(1.2.0.7)|(4.1.5.0)|(5.0.2.6)|(4.4.9.0)|(6.1.0.1)|(4.4.9.0)|(5.0.8.6)|(5.0.2.4)|(4.4.8.0)|(4.4.6.0)' bookmarked_ip > unique_visits

exit 0
0 голосов
/ 04 ноября 2013

egrep '[[: digit:]] {1,3} (. [[: Digit:]] {1,3}) {3}' | awk '{print $ 1}' | sort | uniq -c

0 голосов
/ 20 апреля 2011

Используя sed:

$ sed 's/.*\(<regex_for_ip_address>\).*/\1/' <filename> | sort | uniq -c

Вы можете найти и найти регулярное выражение для IP-адреса в Inernet и заменить его на <regex_for_ip_address>.например, Из ответов на связанный вопрос по stackoverflow

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...