Баш як я можу сказати з повторення 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