Enviando um conteúdo personalizado baseado em uma pesquisa específica em um arquivo de log

1

Usando abaixo de test.sh , estou obtendo o resultado em dump.txt conforme abaixo:

test.sh:

#!/bin/bash

#"Maxl-script" zone starts.....
essmsh -l admin password -s localhost -i << EOF

spool on to 'dump.txt';
display session all;
spool off;

EOF
#"Maxl-script" zone ends.....

dump.txt:

user                session             login_time          application         database            db_connect_time     request             request_time        connection_source   connection_ip       request_state
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------
 admin                                 0                   9                                                           0 none                                  0 Not Requested*      a00:bf32::                    
 admin                         989855740                1335 DRRDEVMH            DRRPRODB                           1201 none                                  0 Not Requested       a00:8a45::                    
 admin                        1768947706                 932 test                test                                916 none                                  0 Not Requested       a00:94b6::                    

 WARNING - 1241024 - Possible string truncation in column 1.
 WARNING - 1241028 - Output column defined with warnings.
 WARNING - 1241024 - Possible string truncation in column 9.
 WARNING - 1241028 - Output column defined with warnings.
 WARNING - 1241024 - Possible string truncation in column 10.
 WARNING - 1241028 - Output column defined with warnings.
 OK/INFO - 1241044 - Records returned: [3].

Como podemos ver na última linha de dump.txt , há uma string Records returned: [3] . Esse dígito 3 é meu destino. Quero enviar uma notificação por e-mail para usuários que tenham as seguintes linhas como corpo do e-mail:

Total Number of Sessions running = 3 

NOTE: This is an automatically generated email, please don't reply to it.

Depois de pesquisar no Google, consegui usar o método abaixo para concluí-lo.

Alguém por favor pode me ajudar como usar sed ou qualquer outro método para atingir meu objetivo no script acima?

$ var=Records returned :
echo "Total Number of Sessions running = $var | sed 's/.*://' " > file.tmp 
echo -e "\n" >> file.tmp 
echo "NOTE: This is an automatically generated email, please don't reply to it."  >>   file.tmp 
fi

mailx -s "Subject" emailaddresses < file.tmp
rm file.tmp

NOTA: Records Returned... line será sempre a última linha em dump.txt .

    
por Sunny 03.01.2014 / 07:38

2 respostas

2

Você também pode usar grep e uma lookahead positiva :

$ grep -oP '(\d+)(?=\].s*$)' dump.txt 
3

A expressão regular acima pesquisa a sequência de números mais longa seguida por ]. e 0 ou mais espaços até o final da linha. Você pode combinar isso com o resto da sua mensagem de e-mail da seguinte forma:

$ read -r -d '' message <<'EOF'
> Total Number of Sessions running = $(grep -oP '(\d+)(?=\].\s*$)' dump.txt)
> 
> NOTE: This is an automatically generated email, please don't reply to it.
> EOF
$ echo "$message" | mailx -s "Subject" emailaddresses

Para acertar, digite read -r -d '' message <<'EOF' e tecle Enter . Em seguida, cole ou digite Total Number of Sessions running = $(grep -oP '(\d+)(?=\].\s*$)' dump.txt) hit Digite novamente (quantas vezes quiser linhas em branco), cole o resto da mensagem e escreva EOF para sair.

    
por 03.01.2014 / 14:02
2

Quando o seu arquivo dump.txt existe e é preenchido como você descreveu, você pode fazer isso com um simples oneliner de shell:

echo -e "Total Number of Sessions running = $(tail -n 1 dump.txt | sed 's/.*\[\([0-9]\)\].*//g')\n\nNOTE: This is an automatically generated email, please don't reply to it." | mail -s "subject" "[email protected] "

Posso precisar explicar um pouco:

tail -n 1 dump.txt | sed 's/.*\[\([0-9]\)\].*//g imprime a última linha do arquivo dump.txt e exclui tudo, exceto o dígito das chaves [] . (no seu exemplo: 3 )

Esta informação mais as seqüências em torno dela são enviadas para o comando de correio que as lê a partir do STDIN e envia um email para o endereço fornecido.

    
por 03.01.2014 / 08:29