Подробное объяснение можно найти в различных регулярных выражений (регулярное выражение) учебные пособия; 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 - й столбец (час).
Я думаю, что ОП хочет, чтобы все журналы были с 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 или что-то для этого час вообще).
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 означает, что фактический диапазон дат или период времени, который вы запросили, не был найден в журнале. В этом случае самое близкое время к указанному вами времени будет обнаружено и использовано вместо этого.
^[^ ]+
роль ..Зачем использовать grep? Вы можете просто использовать sed.
пример:
Это напечатает все журналы между
June 17 13:39:54
иJune 18 10:50:28
источник
Там на самом деле гораздо проще сделать это.
Загрузить / Документация: autodrgrep.kl.sh
Команда:
Объяснение:
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, вы говорите, что если что-то найдено, что соответствует указанным шаблонам, выводится на экран.
Образец прогона:
Что делать, если указанный пользователем диапазон дат или период времени отсутствуют в журнале?
Каждый запуск вышеуказанной команды всегда будет иметь строку (последнюю строку выходных данных), которая говорит либо «ATWFILF», либо «ETWNFILF».
ATWFILF означает, что в журнале был найден фактический диапазон дат или период поиска, который вы запрашивали. Так что это очень хорошо.
ETWNFILF означает, что фактический диапазон дат или период времени, который вы запросили, не был найден в журнале. В этом случае самое близкое время к указанному вами времени будет обнаружено и использовано вместо этого.
источник