20

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

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

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

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

3 ответа3

22
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-й столбец (час).

19

Зачем использовать 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

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 означает, что фактический диапазон дат или период времени, который вы запрашивали, НЕ был найден в журнале. В этом случае ближайшее время к указанному вами времени будет обнаружено и использовано вместо этого.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .