/ / Count ip повторити в журналі з bash-масивів, регулярний вираз, bash, багатовимірний масив

Граф ip повторюється в журналі з bash-масивів, регулярних виразів, bash, багатовимірних масивів

Баш як я можу сказати з повторення IP в журнал через конкретний пошук?

На прикладі:

#!/bin/bash

# Log line: [Sat Jul 04 21:55:35 2015] [error] [client 192.168.1.39] Access denied with status code 403.

grep "statusscodes403" /var/log/httpd/custom_error_log | while read line ; do

pattern="^[.*?]s[error]s[clients(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)].*?403"
[[ $line =~ $pattern ]]

res_remote_addr="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}.${BASH_REMATCH[4]}"

echo "Remote Addr: $res_remote_addr"

done

Мені потрібно знати кінцеві результати, отримані кілька разів по кожному повідомленню 403 ip, якщо можливо, сортувати від найвищого до найнижчого.

За прикладом вихід:

200.200.200.200 50 times.
200.200.200.201 40 times.
200.200.200.202 30 times.
... etc ...

Для цього нам потрібно створити HTML-звіт із щомісячного журналу apache в серії подій (щось на кшталт awstats).

Відповіді:

2 для відповіді № 1

є кращі способи. Нижче наведено мою пропозицію, яка повинна бути більш читабельною та простішою для підтримки:

grep -P -o "d{1,3}.d{1,3}.d{1,3}.d{1,3}" log_file | sort | uniq -c | sort -k1,1 -r -n

вихід має бути у формі:

count1 ip1
count2 ip2

оновлення:

фільтр тільки 403:

grep -P -o "d{1,3}.d{1,3}.d{1,3}.d{1,3}(?=.*403)" log_file | sort | uniq -c | sort -k1,1 -r -n

Помітимо, що погляду в майбутнє вистачить.


0 для відповіді № 2

Якщо файл журналу у форматі, зазначеному у питанні, найкраще використовувати awk щоб відфільтрувати необхідний код статусу плюс виведення тільки IP. Тоді використовуйте uniq команда розраховувати кожне явище:

awk "/code 403/ {print $8}" error.log | sort | uniq -c |sort -n

В awk, ми фільтруємо за регулярним виразом /code 403/ а потім для відповідних ліній ми друкуємо восьме значення (значення розділені пропуском), тобто IP.

Тоді нам потрібно сортувати вихід, так що однакові IP-адреси один за одним - це вимога uniq програма

uniq -c друкує кожен унікальний рядок із вводу лише один раз - і передує кількості подій. Finnally ми сортуємо цей список численним, щоб отримати ІР, відсортовані за підрахунками.

Вибірка результатів (спочатку це число випадків, другий це IP):

1 1.1.1.1
10 2.2.2.2
12 3.3.3.3