Grep последний файл для строки и оповещения / электронной почты, если найден

Я хочу извлечь эту строку ‘FCE-Error’ из папки, которая содержит множество текстовых файлов

Папка выглядит так

-rw-r--r-- 1 root root 0 May 22 10:30 T201805220930.CIR -rw-r--r-- 1 root root 11298297 May 22 10:40 T201805220935.CDR -rw-r--r-- 1 root root 0 May 22 10:35 T201805220935.CIR -rw-r--r-- 1 root root 12230924 May 22 10:45 T201805220940.CDR -rw-r--r-- 1 root root 0 May 22 10:40 T201805220940.CIR -rw-r--r-- 1 root root 12707339 May 22 10:50 T201805220945.CDR -rw-r--r-- 1 root root 0 May 22 10:45 T201805220945.CIR -rw-r--r-- 1 root root 13080477 May 22 10:55 T201805220950.CDR -rw-r--r-- 1 root root 0 May 22 10:50 T201805220950.CIR -rw-r--r-- 1 root root 13762418 May 22 11:00 T201805220955.CDR -rw-r--r-- 1 root root 0 May 22 10:55 T201805220955.CIR -rw-r--r-- 1 root root 13582035 May 22 11:05 T201805221000.CDR -rw-r--r-- 1 root root 0 May 22 11:00 T201805221000.CIR -rw-r--r-- 1 root root 13910251 May 22 11:10 T201805221005.CDR -rw-r--r-- 1 root root 0 May 22 11:05 T201805221005.CIR -rw-r--r-- 1 root root 3360658 May 22 11:11 T201805221010.CDT -rw-r--r-- 1 root root 0 May 22 11:10 T201805221010.CIT 

Он генерирует новые файлы каждые 5 минут. Файл CDT = живой файл журнала. Файл CDR = это предыдущий файл CDT, прежде чем он создаст новый.

Мне нужен скрипт bash, который будет grep для файла .cdt или cdr для этой строки FCE-Error

Если он находит положительное значение / запись, то мне нужно уведомление по электронной почте

Сверху моей головы это должно сделать:

 [ $(find /path/to/dir -cmin -5 -type f -exec grep -F 'FCE-Error' {} \; | wc -l) -gt 0 ] && mail [...] # I let you complete mail command 

Эта строка поиска (поиска) для файлов (-type f), созданных за последние 5 минут (-cmin -5), и для каждого выполнения grep вывод затем передается в wc для подсчета строк, общий результат сравнивается с 0 ( -gt) и, если оно истинно, запускает почтовую команду для отправки почты.

Вы можете настроить эту команду так, чтобы она запускалась каждые 5 минут в cron и позволяла избегать повторных предупреждений (из нескольких крайних случаев, когда предупреждение только пришло, а cron не пришел вовремя)

Вы хотите только grep самый последний файл .cdt / cdr?

 dir=/path/to/files lastCIR="$(find ${dir} -type f -name '*.CIR' | tail -1)" lastCDR="$(find ${dir} -type f -name '*.CDR' | tail -1)" if grep FCE-Error "${lastCIR}" || grep FCE-Error "${lastCDR}";then echo 'alert' | mail -s subject mail@example.com fi 

Предполагая, что файлы находятся в текущем каталоге, вы используете bash :

 files=( T*.CDT ) grep 'FCE-Error' "${files[-1]}" 

Это позволит получить самый последний файл .CDT для строки. Вы можете сделать то же самое для другого типа файла.

Шаблон T*.CDT оболочки T*.CDT распространяется на все совпадающие имена файлов, отсортированные по лексикографическому T*.CDT , и, поскольку вы используете правильные имена файлов (с правильными временными метками, которые сортируются правильно), последним из них будет последний файл.

Чтобы отправить уведомление, если строка найдена:

 files=( T*.CDT ) if grep -q 'FCE-Error' "${files[-1]}"; then mail -s 'Alert' someperson@example.com < 

Использование некоторой другой оболочки POSIX:

 set -- T*.CDT # set positional parameter to all matching filenames shift "$(( $# - 1 ))" # shift off all but the last filename if grep -q 'FCE-Error' "$@"; then mail -s 'Alert' someperson@example.com <