Grep o arquivo mais recente para string e alert / email se encontrado

0

Eu quero grep esta string 'FCE-Error' de uma pasta que contém muitos arquivos baseados em texto

A pasta parece com isso

-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

Ele gera novos arquivos a cada 5 minutos Arquivo CDT = arquivo de log em execução ao vivo Arquivo CDR = é o arquivo CDT anterior antes de gerar um novo

Eu preciso de um script bash que faça o grep do arquivo .cdt ou cdr para essa string FCE-Error

Se encontrar um valor / entrada positivo, preciso de um alerta no email

    
por WMK83 22.05.2018 / 12:19

3 respostas

0

Do topo da minha cabeça isso deve ser feito:

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

Esta busca de linha (find) para arquivos (-type f) criados nos últimos 5 minutos (-cmin -5) e para cada grep de execução, a saída é passada para wc para contar linhas, o resultado geral é comparado para 0 (-gt) e se for verdade, acione o comando mail para enviar o email.

Você pode configurar este comando para executar a cada 5 minutos no cron e deve evitar alertas repetidos (fora de alguns casos de borda quando o alerta acabou de chegar e o cron não está exatamente na hora)

    
por 22.05.2018 / 13:55
0

Você deseja apenas usar o arquivo .cdt / cdr mais recente?

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
    
por 22.05.2018 / 13:34
0

Supondo que os arquivos estejam no diretório atual, o anúncio que você está usando bash :

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

Isso irá mostrar o arquivo .CDT mais recente para a string. Você poderia fazer o mesmo para o outro tipo de arquivo.

O padrão shell globbing T*.CDT se expande para todos os nomes de arquivos correspondentes ordenados lexicograficamente, e desde que você esteja usando nomes de arquivos sãos (com timestamps apropriados que classificam corretamente), o último deles será o arquivo mais recente.

Para enviar um alerta se a string for encontrada:

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

Usando algum outro shell 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' [email protected] <<END_MESSAGE
We've found "FCE-Error" in ${files[-1]}, do something!
END_MESSAGE
fi
    
por 01.06.2018 / 10:14