Назад | Перейти на главную страницу

Журналы Apache / Требуется справка по команде Grep

Мне нужно иметь возможность видеть все запросы, сделанные с IP-адреса в определенный день.

Я не знаком с grep и хотел бы знать, может ли кто-нибудь помочь мне.

Предполагая, что ваш журнал находится в /var/log/apache2/access.log и предполагая, что ваши журналы Apache имеют общий или комбинированный формат:

$ grep "^w\.x\.y\.z" /var/log/apache2/access.log

например искать 127.0.0.1

$ grep "^127\.0\.0\.1" /var/log/apache2/access.log

Могу ли я ограничить результаты поиска определенным днем?

Мне нравится awk для таких вопросов; вы можете сопоставить несколько полей в одной команде. Если мы предполагаем, что вы используете стандартный формат журнала Apache, поле 1 - это IP-адрес, а поле 5 - дата доступа:

$ awk '$1 ~ /8\.8\.8\.8/ && $4 ~ /15\/Dec\/2009/ { print }' /var/log/apache2/access.log

awk обрабатывает каждую строку в файле и разбивает ее по пробелам на переменные с именами $1, $2, и так далее. Вы можете сопоставить их с $2 ~ /REGEX/ синтаксис, и вы можете сопоставить несколько полей.

Apache хранит дату в нелепом формате ДД / Пн / ГГГГ, поэтому вам нужно избегать / символ, который делает сопоставление дат немного громоздким.

Уединенный { print } напечатает всю строку (awk также знает это как $0). Если вы хотите создать только определенные поля, вы можете добавить их в оператор печати. Если вы хотите только распечатать запрошенный URI, вы должны сделать:

$ awk '$1 ~ /8\.8\.8\.8/ && $4 ~ /15\/Dec\/2009/ { print $7 }' /var/log/apache2/access.log

Поскольку URI запроса - это поле 7 в журнале.

В качестве альтернативы приведенным выше ответам без «сложности» (для некоторых) регулярного выражения.

Сначала я проверяю (отслеживаю) файл журнала на предмет формата даты, например:

tail filename
127.0.0.1 - - [31/Jan/2017:18:33:08 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:09 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:12 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:13 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:14 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:15 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:16 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:17 +0100] "OPTIONS * HTTP/1.0" 200 155

затем я просто копирую / вставляю дату как буквальную строку, например:

grep "31/Jan/2017" file | grep 127.0.0.1

или, иногда мне нужно сузить его до часа, поэтому я просто копирую с ним час:

grep "31/Jan/2017:18" file | grep 127.0.0.1