Мне нужно иметь возможность видеть все запросы, сделанные с 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