Как перехватить запущенный журнал, используя скрипт bash? [Дело закрыто]

Я новый игрок в сценарии Bash. Есть кое-что, что я хочу знать о захвате файла журнала, используя скрипт bash.

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

file[20160509_130000].log

Файл журнала содержит подробную информацию, подобную этой.

13:00:00 INFO  [file.chdev130] Event: ADIEVN_PLAY_DONE, Finished  , nbytes=16360
13:00:00 INFO  [file.chdev39] adiCollectDigits() success

Мой вопрос: как я могу прочитать и сохранить текущий журнал или за час до того, как получить определенный параметр (например, "Событие") в новый файл, используя сценарии bash?

Может ли кто-нибудь научить меня, как это сделать? Благодарю.

Обновление Здесь поток, который я хочу (на этот раз я хочу знать, как работает первая точка):

  1. Получить журнал работ или за час до.
  2. Прочитайте 15-минутный интервал (13:00:00 - 13:15:00).
  3. grep параметр (например, "Событие") в этом интервале.
  4. Посчитайте параметр.
  5. Сохраните его в другом файле.

РЕШИТЬ

Здесь решение на случай, если кому-то это нужно.

  1. Перечислите все содержимое на основе отметки времени, используя ls -t тогда труба это
  2. использование grep -v ^d (я до сих пор не знаю точного объяснения ^d), опять труба
  3. Показать первые несколько строк с head

Итак, результат

ls -t *.log | grep -v ^d | head -1 (for display the running log)
ls -t *.log | grep -v ^d | head -2 | tail -1 (for display the one log before the running log)

Надеюсь, это поможет. Спасибо

== Дело закрыто ==

2 ответа

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

fname="file[`date -v-1H '+%Y%m%d_%H0000'`].log"

даст вам предыдущее имя файла. не указывать -v-1H чтобы получить текущий.

Для 15-минутных интервалов вы можете использовать регулярные выражения, такие как '^\d\d:(0\d|1[0-4])' для интервала 00:00-14:59, '^\d\d:(1[5-9]|2\d)' для 15:00-29:59 и т. д. Например, в первом регулярном выражении ^ соответствует началу строки, \d\d: соответствует "две цифры и двоеточие", и (0\d|1[0-4]) соответствует 0 с любой соседней цифрой или 1 с соседней цифрой от 0 до 4. Во втором регулярном выражении (1[5-9]|2\d) соответствует 1 с цифрой от 5 до 9 или 2 с любой цифрой.

Затем вы grep -Po '(?<=Event: ).+(?=,)' тип событий в вашем журнале, при условии, что тип события всегда заканчивается ,, Это регулярное выражение будет жадно соответствовать любым символам, начиная с одного символа, если они находятся между строками Event: а также , (Event: а также , Сами по себе не совпадают, вот для чего нужны взгляды назад /lookaheads). Тогда используйте sort | uniq -c подсчитать количество разных событийных записей.

Таким образом, полученный скрипт будет выглядеть примерно так:

fname="file[`date -v-1H '+%Y%m%d_%H0000'`].log"
grep -P '^\d\d:(0\d|1[0-4])' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_00-14"  # entries for first 15 minutes
grep -P '^\d\d:(1[5-9]|2\d)' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_15-29"  # entries for second 15 minutes
grep -P '^\d\d:(3\d|4[0-4])' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_30-44"  # entries for third 15 minutes
grep -P '^\d\d:(4[5-9]|5\d)' "$fname" | grep -Po '(?<=Event: ).+(?=,)' | sort | uniq -c > "/tmp/$fname_45-59"  # entries for fourth 15 minutes

за последний час

Другой подход заключается в использовании logtail с записями cron для получения последних записей в журнале вместо grepping. Вы можете настроить свой скрипт для запуска cron на 00, 15, 30 и 45 минут каждый час, определить имя файла журнала внутри него и logtail файл, как logtail -f "$fname", Уловка в том, что при работе в 00 минут вам нужно будет использовать -v-1H переключитесь на дату, и этот подход не так точен, как вычеркивание времени.

tail -f /path-to-logfile позволит вам читать файл непрерывно, пока вы не отмените tail выполнение.
grep "^13:" /path-to-logfile покажет вам все строки в файле, который начинается с "13:", в нашем случае вы получите каждую запись за 13-й час.
grep "Event" /path-to-logfile Я покажу вам все строки с "Event", я думаю, вы уже поняли про grep.)

Другие вопросы по тегам