Як зібрати файл журналу протягом певного періоду часу


22

У мене є файл журналу, кожен рядок у журналі є датою, наприклад:

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

Як зробити grepцей файл і отримати лише рядки з 8 ранку до 11 вечора?

Моє намір я хочу підрахувати кількість помилок, які трапляються протягом 8 ранку до 11 вечора.

Відповіді:


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

Докладне пояснення можна знайти в різних регулярних виразів (регулярний вираз) навчальні посібники; egrepвикористовує синтаксис "POSIX Extended" ( 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 - й стовпець (годину).


Привіт, це працює .. але ви можете додати трохи пояснень, як це працює? Я не отримую ^[^ ]+частину ..
Росді

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 випадків вказаних вами рядків пошуку.

  • -how показує, який тип відповіді ви отримаєте. Вказуючи -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 означає, що фактичний діапазон дат або часовий проміжок, який ви просили шукати, НЕ знайдено в журналі. У цьому випадку буде визначений і використаний найближчий час до вказаного вами часу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.