Вопрос или проблема
Мой файл журнала выглядит следующим образом:
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 11/Авг/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 12/Авг/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 13/Авг/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 14/Авг/2020:23:33:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
Я хочу искать указанные выше записи, задав диапазон дат, как ниже:
./Logsearch.sh 10/Авг/2020 13/Авг/2020
Ожидаемый результат:
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 11/Авг/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 12/Авг/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 13/Авг/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
Как я могу это сделать?
Есть ли идеи, как написать скрипт для моего запроса. Возможно, ОС – Solaris 11. Пожалуйста, предоставьте пример скрипта.
Это выглядит как стандартный журнал доступа HTTP, так почему бы не использовать grep
, чтобы сопоставить искомые даты?
$ grep '1[0-3]/Авг/2020' access_log
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 11/Авг/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 12/Авг/2020:23:
Ответ или решение
Как выполнять поиск логов по диапазону дат
В данной статье мы рассмотрим, как эффективно искать записи в логах по заданному диапазону дат, используя предоставленный вами формат лог-файлов. Лог-файл содержит записи в формате, где каждая строка начинается с IP-адреса, затем идет информация о времени запроса, методе, URL, статусе ответа и размере.
Пример лог-файла:
10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 11/Aug/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 12/Aug/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 13/Aug/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 14/Aug/2020:23:33:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
Задача
Мы хотим отфильтровать записи из логов, чтобы получить данные, которые попадают в заданный диапазон дат, например, с 10 Авг 2020 по 13 Авг 2020.
Использование командной строки и утилит
Для выполнения этой задачи на операционной системе Solaris 11, вы можете использовать такие инструменты, как grep
, awk
, или специализированные скрипты на языках программирования, таких как Perl или Raku.
1. Использование grep
Чтобы быстро отфильтровать записи между определёнными датами, используйте следующую команду:
grep '1[0-3]/Aug/2020' access_log
Эта команда найдет строки, в которых дата находится между 10 и 13 августом 2020 года. Условие 1[0-3]
обозначает числа от 10 до 13.
2. Использование awk
Для более сложной фильтрации можно использовать awk
:
awk -v start="10/Aug/2020" -v end="13/Aug/2020" '{split($4, d, ":"); if (d[1] >= start && d[1] <= end) print $0}' access_log
Этот скрипт сначала разбивает дату на компоненты, а затем проверяет, лежит ли она в заданном диапазоне.
3. Использование Perl и модуля Time::Piece
Пример использования Perl для более точной фильтрации:
perl -MTime::Piece -sne '
BEGIN {
our $since = Time::Piece->strptime($since, "%d/%b/%Y")->epoch;
our $until = Time::Piece->strptime($until, "%d/%b/%Y")->epoch;
}
if (m!(\d{2}/(?:Aug)/\d{4}:\d{2}:\d{2}:\d{2})\s([+-]\d{4})!) {
my $d = Time::Piece->strptime("$1 $2", "%d/%b/%Y:%H:%M:%S %z")->epoch;
if ($d >= $since && $d <= $until) {
print;
}
}
' -- -since=10/Aug/2020 -until=13/Aug/2020 access_log
Этот скрипт использует библиотеку Time::Piece
, чтобы более удобно работать с датами и проводить фильтрацию по диапазону.
Заключение
Существует множество способов поиска и фильтрации логов по диапазону дат. В зависимости от ваших нужд и навыков можно использовать простые инструменты командной строки или более сложные скрипты на Perl. Важно понимать, что правильный выбор метода может значительным образом повлиять на эффективность и удобство работы с логами.
Таким образом, вы сможете легко находить информацию, соответствующую вашим требованиям, в большом объеме логов.