Меню

Grep awk вывести строки лога начиная с даты

Поиск строк по времени в файле

Всем привет. Нужна помощь. Есть файл, в котором 1000 строк. Необходимо сделать сортировку этих строк по двум параметрам: промежуток времени и ключевое слово. По ключевому слову я понимаю как сделать, а как правильно задать поиск по временному промежутку (например: 04-04-2016 15:00 — 04-04-2016 17:00). В каком направлении искать информацию?

Так ты найдёшь только записи к полному часу. Тогда уж:

Да, точно, спасибо! Но кавычки двойные вроде нужны.

Да, кавычки двойные, но это и так понятно. Спасибо огромное за помощь.

Так поиск или сортировка? Или и то и другое? В ответах вижу только поиск

А если необходимо найти строки в которых упоминается к примеру слово «Word» но в разные промежутки времени. К примеру за один промежуток будет так: grep «04-04-2016 15:» filename | grep «Word». А если необходимо добавить второй промежуток, к примеру: grep «08-01-2016 10:17:» filename | grep «Word»? Простое перечисление выводить не полный список: grep «04-04-2016 17:» filename | grep «Word» | grep «08-01-2016 10:17:» filename | grep «Word». В этом случае выводится только второй промежуток времени.

Вы имеете ввиду: grep -E «(«14-03-2016 14:» /home/gaudi/Desktop/pv-wtc-2 | grep «33m» | «19-02-2016 16:56» /home/gaudi/Desktop/pv-wtc-2 | grep «33m»)»? Он не работает. Есть два условия, в каждом условии по два условия (параметра).

No. grep -E ‘(14-03-2016 14:|19-02-2016 16:56)’ /home/gaudi/Desktop/pv-wtc-2

Источник

👨👨👧👧 Как извлечь строки логов определенных дат из файла журнала

Добрый день, ребята.

Сегодня мы бы хотели бы обсудить, как извлечь строки журнала определенных дат из файла журнала.

Если вы тот самый специалист, который просматривает тысячи записей в логах между строк в поисках чего-то конкретного, то эта статья подойдет вам лучше всего.

Как извлечь строки логов определенных дат из файла журнала

В этом руководстве мы узнаем, как использовать такие инструменты, как grep, sed, для извлечения строк журнала определенных дат.

Для этого вам нужно открыть файл журнала и проверить формат даты.

Например, в моем случае это пример строки журнала из файла журнала, который мы будем использовать для демонстрации.

Теперь, когда мы знаем формат даты, приступим к извлечению строк.

Использование grep для извлечения строк из журналов

Для начала давайте рассмотрим примеры использования grep для извлечения строк журнала с конкретными датами из файла логов.

Извлечь события, которые произошли четыре дня назад от текущей даты;

Как вы можете видеть выше, команда date выводит дату и удаляет начальный ноль, чтобы формат даты совпадал с датами в файле журнала.

Если у вас разные форматы даты, вы определенно должны поиграть с командой date, чтобы получить правильный формат.

Например, чтобы получить логи от конкретной даты и времени на основе формата даты в файле журнала, например, 8th April, 09:22;

Чтобы получить строки определенного диапазона дат, скажем, с 6 по 7 апреля;

Использование sed для извлечения строк из журнала

Далее, давайте посмотрим, как использовать grep для извлечения строк журнала определенных дат.

Читайте также:  Когда можно вывести материнский капитал

В нашем предыдущем руководстве мы обсуждали, как удалять строки, соответствующие определенному шаблону в файле, используя SED.

Вы можете проверить это, перейдя по ссылке ниже;

Чтобы извлечь строки журнала определенной даты, скажем 6 апреля,

Извлечь строки журнала определенных диапазонов дат;

Выше, как вы можете видеть, система выводит все строки от указанной первой даты до включая только первую строку указанной последней даты.

Если в диапазоне указано более одной строки последней даты, вам необходимо включить следующую дату после указанной последней даты в диапазон и удалить последнюю строку.

Например, вывести строки с 7 по 8 апреля;

Это всего лишь несколько примеров того, как извлечь строки журнала определенных дат из файла логов с помощью команд sed и grep.

Оставьте свои примеры и предложения в комментариях ниже.

Источник

Как grep файл журнала в течение определенного периода времени

У меня есть файл журнала, каждая строка в журнале добавляется с датой, например:

2012-03-06 11:34:48,657 blah blah blah.

Как мне grep этот файл и получить только строки с 8 утра до 11 вечера?

Мое намерение заключается в том, что я хочу подсчитать количество ошибок, происходящих с 8 утра до 11 вечера.

3 ответа

Подробное объяснение можно найти в различных регулярном выражении (регулярное выражение); egrep использует синтаксис POSIX extended ( man 7 regex ).

Первый ^ означает «начало строки».

[^ ]+ просто совпадает с полем даты, независимо от фактической даты.

[. ] означает «любой символ между скобками», поэтому [89] будет соответствовать либо 8 , либо 9 ; 2 — любое число, а [^ ] ничего кроме пробела (из-за ^ внутри скобок).

+ означает «один или более предыдущего» (например, a+ будет соответствовать a , aaa и aaaaaaaa ).

Итак ^[^ ]+ начнется с начала строки и будет соответствовать как можно больше не пробелов.

(. |. |. ) означает «любой из указанных шаблонов», поэтому (0[89]|15|2[012]) означает «либо 0[89] или 16 или 2[012] «. Он будет соответствовать всем номерам от 08 до 22.

Несколько лучший вариант:

Параметр -F разбивает каждую строку на отдельные поля в соответствии с [: ] regex (соответствие либо : , либо пробел), и сценарий awk проверяет второй столбец (час).

Зачем использовать grep? Вы можете просто использовать sed.

Это будет печатать все журналы между June 17 13:39:54 и June 18 10:50:28

На самом деле гораздо более простой способ сделать это.

Команда:

Объяснение:

autodrgrep.kl.sh — это имя инструмента.

notchef — это опция, которая передается инструменту, чтобы сообщить ему, что делать. В этом конкретном случае он сообщает инструменту, что такое файл журнала /tmp/client.log.

/tmp/client.log — это, конечно, файл журнала.

2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 — это диапазон дат из журнала, который вы хотите отсканировать

«INFO» — это одна из строк, которая находится в строках журналов, которые вас интересуют.

«a2ensite» — это еще одна строка в той же строке, которую вы ожидаете найти в строке «INFO». Указание этих двух строк (INFO и a2ensite) изолирует и обрабатывает линии, которые вы хотите намного быстрее, особенно если вы имеете дело с огромным файлом журнала.

Читайте также:  Чем отмыть зеленку с линолеума с мебели

5 указывает Предупреждение. Указав 5, вы сообщаете программе предупреждать как ПРЕДУПРЕЖДЕНИЕ, если есть как минимум 5 вхождений строк поиска, которые вы указали

10 указывает Критический. Указав 10, вы сообщаете программе предупреждать как CRITICAL, если есть как минимум 10 вхождений строк поиска, которые вы указали.

-show указывает, какой тип ответа вы получите. Указав -shown, вы говорите, если что-то найдено, что соответствует указанным шаблонам, вывести на экран.

Пример прогона:

Что делать, если заданный пользователем диапазон дат или временной интервал не находится в журнале?

В каждом запуске указанной команды всегда будет строка (последняя строка вывода), которая либо говорит «ATWFILF», либо «ETWNFILF».

ATWFILF означает, что фактический диапазон дат или временной интервал, который вы запросили, был найден в журнале. Так что это очень хорошо.

ETWNFILF означает, что фактический диапазон дат или временной интервал, который вы запросили, НЕ был найден в журнале. В этом случае будет обнаружено и использовано ближайшее время до указанного вами времени.

Источник

Вывести лог за определенное время

Есть «программулина» которая ведет свой лог. Формат лога следующий «15.02.2018 14:59:17 — какое-то событие» Строки по датам могут достигать огромных размеров. Вопрос: как с помощью grep или find вывести период времени, например вывести лог за промежуток времени от «15.02.2018 14:59:17 до 15.03.2018 14:59:17» Спасибо.

4 ответа 4

Выбрать интервал времени регулярным выражением из лог-файла — задача трудоемкая.

Я бы предложил использовать awk .

В соответствии с примером можно попробовать сделать так:

Основная задача тут — преобразовать дату в «правильный» формат «yyyy-mm-dd». Поскольку в лог-файлe дата представлена в формате «dd.mm.yyyy», то даты сравнить как строки (или преобразовать в timestamp) не получится. Точнее, сравнить получится, но будет неверный результат.

Поэтому для программы awk задаем границы времени (переменные Date и Date2) в формате «YYYY-mm-dd HH:MM:SS», и к этому же формату приводим дату из лог файла (функция split), и далее проверяем эту дату с попаданием в диапазон.

Не знаю, насколько хорошо в этом случае сравнивать даты как строки, но при желании можно предварительно конвертировать значения в timestamp.

Если вам непринципиально (а в рамках реальной практики обычно так и бывает), то просмотрите логи отдельно:

Возможно, будет сподручнее запилить однострочный скрипт на перле™, который будет принимать параметры времени начала и конца просмотра и, проходя по файлу, выводить только события, случившиеся в указанном промежутке.

Нубовский вариант, но рабочий:

смотрю номер строки, запоминаю.

опять смотрю, запоминаю.

И финальная команда для вывода:

[666,1488p — номера строк. У вас будут другие цифры]

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

теоретиески тут два пути решения:

  1. извлекать символы, содержащие дату (и опционально — время) и преобразовывать их в тип, поддающийся сортировке (какой-нибудь там datetime, unixtimestamp и т.п.), а затем уже сортировать по этой дате. см. примечание ниже.
  2. переставить символы так, чтобы компоненты даты были перечислены в «естественном» порядке: «15.03.2018» превратить в «2018.03.15», а затем сортировать как самые обычные строки.
Читайте также:  Прибор который чистит зубы струей

второй путь, теоретически, менее накладный, чем первый.

для удобства удаления строк, которые будут «выше» указанной стартовой даты, можно добавить перед сортировкой строку с этой датой, а потому удалить все строки с первой по эту фиктивную. аналогично и с конечной датой.

стартовая дата будет включена в результат, а конечная дата — нет (будут включены строки, находящиеся выше).

вот пример скрипта на языке, понятном интепретатору sh:

если в файле с логом содержатся такие строки:

то запуск скрипта выведет из них две средние:

начальную и конечную даты, указанные в скрипте в переменных from и to соответственно, можно «округлять» до любого символа.

например, с точностью до минуты:

примечание по поводу синтаксического разбора даты

если дата, как в примере из вопроса, записана в «неестественном» порядке, то «искусственный интеллект», заложенный в алгоритмы разбора, запросто даёт сбой.

например, дата 16.02.2018 , при использовании в качестве парсера программы awk, предложенной в ответе @de_frag, оказывается «больше», чем 15.03.2018 :

ну и, конечно, никакой «искуственный интеллект не поможет определить, какая дата записана в виде 01.02.2018 — первое февраля или второе января.

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Временной интервал GREP

Модератор: Bizdelnick

Временной интервал GREP

Сообщение sarafan » 09.04.2020 21:26

Re: Временной интервал GREP

Сообщение /dev/random » 09.04.2020 22:08

Re: Временной интервал GREP

Сообщение sarafan » 09.04.2020 22:27

Re: Временной интервал GREP

Сообщение /dev/random » 09.04.2020 22:34

Re: Временной интервал GREP

Целиком задание звучит так, как написать команды?

В системе обнаружен баг. Он проявлялся 30.12.2019 и 31.12.2019 с 21:30:00 до 21:39:59. При этом появлялись ошибки с номерами 400 и 500. Твоя задача — сохранить в отдельный файл логи, которые были записаны в этот период.
Затем эти логи надо разложить по отдельным файлам: логи с одинаковой ошибкой положи в один файл. Как это сделать:
В домашней директории на удалённом сервере создай директорию bug1.
Все запросы, которые произошли в указанный период, положи в файл main.txt.
Внутри директории bug1 создай директорию events.
Внутри директории events создай файлы для ошибок с номерами 400 и 500. Назови эти файлы 400.txt и 500.txt соответственно. В них выдели логи с соответствующей ошибкой из файла main.txt.

В ответе приложи:
команды, которые создают директории bug1 и events;
команду, которой ты выбираешь запросы за указанный период. Это те запросы, которыми ты отбираешь логи в файл main.txt;
команды, которыми ты кладёшь логи в файлы 400.txt и 500.txt из main.txt;
тексты файлов 400.txt и 500.txt.

Re: Временной интервал GREP

Сообщение Bizdelnick » 07.03.2021 13:06

Источник