Добрый день, ребята.
Сегодня мы бы хотели бы обсудить, как извлечь строки журнала определенных дат из файла журнала.
Если вы тот самый специалист, который просматривает тысячи записей в логах между строк в поисках чего-то конкретного, то эта статья подойдет вам лучше всего.
Как извлечь строки логов определенных дат из файла журнала
В этом руководстве мы узнаем, как использовать такие инструменты, как grep, sed, для извлечения строк журнала определенных дат.
Для этого вам нужно открыть файл журнала и проверить формат даты.
Например, в моем случае это пример строки журнала из файла журнала, который мы будем использовать для демонстрации.
Apr 5 08:02:13 amos ntpd[1805]: Soliciting pool server 192.168.206.2
Теперь, когда мы знаем формат даты, приступим к извлечению строк.
Использование grep для извлечения строк из журналов
Для начала давайте рассмотрим примеры использования grep для извлечения строк журнала с конкретными датами из файла логов.
Извлечь события, которые произошли четыре дня назад от текущей даты;
grep "$(date -d '6 day ago' +'%b %d'| sed 's/0//')" test.log ... Apr 8 09:22:52 amos ntpd[1805]: Soliciting pool server 192.168.34.2 Apr 8 09:22:54 amos ntpd[1805]: Soliciting pool server 192.168.71.138 Apr 8 09:22:56 amos ntpd[1805]: Soliciting pool server 192.168.34.2 Apr 8 09:22:58 amos ntpd[1805]: Soliciting pool server 192.168.71.138 Apr 8 09:23:00 amos ntpd[1805]: Soliciting pool server 192.168.34.2 Apr 8 09:23:52 amos ntpd[1805]: Soliciting pool server 192.168.71.138 Apr 8 09:22:54 amos ntpd[1805]: Soliciting pool server 192.168.34. ...
Как вы можете видеть выше, команда date выводит дату и удаляет начальный ноль, чтобы формат даты совпадал с датами в файле журнала.
Если у вас разные форматы даты, вы определенно должны поиграть с командой date, чтобы получить правильный формат.
Например, чтобы получить логи от конкретной даты и времени на основе формата даты в файле журнала, например, 8th April, 09:22;
grep "$(date -d '6 day ago' +'%b %d 09:22' | sed 's/0//')" test.log ... Apr 8 09:22:52 amos ntpd[1805]: Soliciting pool server 192.168.34.2 Apr 8 09:22:54 amos ntpd[1805]: Soliciting pool server 192.168.71.138 Apr 8 09:22:56 amos ntpd[1805]: Soliciting pool server 192.168.34.2 Apr 8 09:22:58 amos ntpd[1805]: Soliciting pool server 192.168.71.138 ...
Чтобы получить строки определенного диапазона дат, скажем, с 6 по 7 апреля;
grep -E "Apr 6|Apr 7" test.log ... Apr 6 09:12:14 amos ntpd[1805]: Soliciting pool server 192.168.206.2 Apr 6 09:12:15 amos ntpd[1805]: Soliciting pool server 192.168.206.2 ... Apr 7 07:22:52 amos ntpd[1805]: Soliciting pool server 192.168.71.138
Использование sed для извлечения строк из журнала
Далее, давайте посмотрим, как использовать grep для извлечения строк журнала определенных дат.
В нашем предыдущем руководстве мы обсуждали, как удалять строки, соответствующие определенному шаблону в файле, используя SED.
Вы можете проверить это, перейдя по ссылке ниже;
? Как удалить строки, соответствующие определенному шаблону в файле, используя SED
Чтобы извлечь строки журнала определенной даты, скажем 6 апреля,
sed -n '/^Apr 6/p' test.log Apr 6 07:00:13 amos ntpd[1805]: Soliciting pool server 192.168.206.2 Apr 6 07:00:19 amos ntpd[1805]: Soliciting pool server 192.168.206.2 ..
Извлечь строки журнала определенных диапазонов дат;
sed -n '/^Apr 7/,/^Apr 8/p' test.log ... Apr 7 06:10:32 amos ntpd[1805]: Soliciting pool server 192.168.71.138 Apr 7 06:10:40 amos ntpd[1805]: Soliciting pool server 192.168.34.2 Apr 7 06:10:45 amos ntpd[1805]: Soliciting pool server 192.168.71.138 ... Apr 8 10:32:54 amos ntpd[1805]: Soliciting pool server 192.168.34.2
Выше, как вы можете видеть, система выводит все строки от указанной первой даты до включая только первую строку указанной последней даты.
Если в диапазоне указано более одной строки последней даты, вам необходимо включить следующую дату после указанной последней даты в диапазон и удалить последнюю строку.
Например, вывести строки с 7 по 8 апреля;
sed -n '/^Apr 7/,/^Apr 9/{/Apr 9/d; p}' test.log ... Apr 7 06:10:32 amos ntpd[1805]: Soliciting pool server 192.168.71.138 Apr 7 06:10:40 amos ntpd[1805]: Soliciting pool server 192.168.34.2 ... Apr 8 10:32:01 amos ntpd[1805]: Soliciting pool server 192.168.71.138 Apr 8 10:32:10 amos ntpd[1805]: Soliciting pool server 192.168.34.2
Это всего лишь несколько примеров того, как извлечь строки журнала определенных дат из файла логов с помощью команд sed и grep.
Оставьте свои примеры и предложения в комментариях ниже.