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

22

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

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

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

Я хочу подсчитать количество ошибок, происходящих в период с 8:00 до 23:00.

Rosdi
источник

Ответы:

24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

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

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

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

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

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

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

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


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

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

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

grawity
источник
Привет, это работает .. но вы можете добавить небольшое объяснение, как это работает? Я не получаю ^[^ ]+роль ..
Росди
20

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

пример:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

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

Нима Г
источник
1
Я думаю, что ОП хочет, чтобы все журналы были с 8 утра до 11 вечера, кроме тех, которые были в определенный день.
Деннис
1
Он тоже может это сделать. Например: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G
1
Неприятная опечатка. Я имел в виду: не те, что в определенный день.
Деннис
2
Проблема этого подхода заключается в том, что в файле журнала должна быть строка с этой отметкой времени. В приведенном выше примере, если нет строки с отметкой времени 2012-03-06 11:34:48, то ничего не будет распечатано. Приведенный выше подход awk будет работать для таких случаев (т. Е. Вам нужны все журналы с часом между 8 и 11, но вы не знаете, есть ли запись журнала во время 2012-03-06 08:00:00 или что-то для этого час вообще).
user650654
0

Там на самом деле гораздо проще сделать это.

Загрузить / Документация: autodrgrep.kl.sh

Команда:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

Объяснение:

  • 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, вы сообщаете программе, что она предупреждает как КРИТИЧЕСКАЯ, если есть как минимум 10 появлений указанных вами строк поиска.

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

Образец прогона:

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

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

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

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

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

SimplifiedWork
источник