Grep 最新文件的字符串和警报/电子邮件(如果找到)

Grep 最新文件的字符串和警报/电子邮件(如果找到)

我想从包含大量基于文本的文件的文件夹中 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

如果它找到正值/条目,那么我需要通过电子邮件发出警报

答案1

假设文件位于当前目录中,并且您正在使用bash

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

.CDT这将 grep 查找该字符串的最新文件。您可以对其他类型的文件执行相同的操作。

shell 通配模式T*.CDT扩展到所有按字典顺序排序的匹配文件名,并且由于您使用的是正常的文件名(具有正确排序的正确时间戳),因此最后一个文件将是最新的文件。

如果找到该字符串,则通过邮件发送警报:

files=( T*.CDT )
if grep -q 'FCE-Error' "${files[-1]}"; then
    mail -s 'Alert' [email protected] <<END_MESSAGE
We've found "FCE-Error" in ${files[-1]}, do something!
END_MESSAGE
fi

使用其他一些 POSIX shell:

set -- T*.CDT            # set positional parameter to all matching filenames
shift "$(( $# - 1 ))"    # shift off all but the last filename
if grep -q 'FCE-Error' "$1"; then
    mail -s 'Alert' [email protected] <<END_MESSAGE
We've found "FCE-Error" in $1, do something!
END_MESSAGE
fi

答案2

从我的想法来看,这应该是这样的:

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

此行搜索(查找)最近 5 分钟内创建的文件(-type f)(-cmin -5),并且对于每次执行 grep,输出都会传递到 wc 来计数行数,总体结果与 0 进行比较( -gt),如果为 true,则会触发 mail 命令发送邮件。

您可以将此命令设置为在 cron 中每 5 分钟运行一次,并且应该避免重复警报(在警报刚刚出现且 cron 不准时的少数边缘情况中)

答案3

您只想 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 [email protected]
fi

相关内容