Как перехватить запущенный журнал, используя скрипт 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?
Может ли кто-нибудь научить меня, как это сделать? Благодарю.
Обновление Здесь поток, который я хочу (на этот раз я хочу знать, как работает первая точка):
- Получить журнал работ или за час до.
- Прочитайте 15-минутный интервал (13:00:00 - 13:15:00).
- grep параметр (например, "Событие") в этом интервале.
- Посчитайте параметр.
- Сохраните его в другом файле.
РЕШИТЬ
Здесь решение на случай, если кому-то это нужно.
- Перечислите все содержимое на основе отметки времени, используя
ls -t
тогда труба это - использование
grep -v ^d
(я до сих пор не знаю точного объяснения ^d), опять труба - Показать первые несколько строк с
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.)