Condição em consulta de arquivo [RESOLVIDO]

1. Condição em consulta de arquivo [RESOLVIDO]

Daniel Fernandes
volcom

(usa Debian)

Enviado em 18/08/2009 - 10:03h

Olá Pessoal,

Não sei se o SED pode me ajudar nessa tarefa, mas vamos lá:

Resumindo, estou criando um script para consultar minha fila de mensagens no Postfix e se algum endereço de e-mail aparecer mais de X vezes nessa consulta é enviado um e-mail para o admin do sistema informando a data, quantidade de mensagens e o endereço de e-mail para verificarmos se é algum ataque de SPAM, etc.

Consegui chegar até a parte onde filtro os endereços e as quantidades, mas não sei como posso verificar a condição "maior que X", vamos aos comandos que usei:

mailq | grep ! | awk '{print $7}' | sort | uniq -c

Assim tenho uma listagem ordenada alfabeticamente no seguinte formato:

1 email@dominio.com
1 email2@dominio2.com
10 email3@dominio3.com
...
E por aí vai, sendo que a quantidade de linhas pode variar.

Preciso testar linha por linha e quando for maior que 5 (não necessariamente esse valor) enviar a informação (quantidade de mensagens e endereço de e-mail) para o e-mail de administrador.

Imagino que seja algo com IF, mas não sei como manipular as informações em variáveis para fazer o teste.

Tentei com o awk, mas ele joga TODOS os valores da primeira coluna na variável de uma só vez:

TESTE=`cat /tmp/teste.txt | awk '{print $1}'

echo $TESTE
1 7 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 2 1 1 1 1 1 4 1 1 1 4 1 1 1 1 1 2 1 1 1 1 3 1 2 1 9 4 4 1 1 1 1 1 1 1 1 1 55 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 8 1 2 426 1 1 1 1 2 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 2 1 1 43 2 1 2 1 1 1 1 1 2 1 1 3 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 12 1 2 2 1 1 1 4 1 1 1 1 1 2 1 1 1

Não sei se estou complicando as coisas (por falta de conhecimento) ou falta de lógica...

Espero que possam clarear minhas idéias, pois qualquer ajuda será muito bem vinda!

Obrigado!


  


2. MELHOR RESPOSTA

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 21/08/2009 - 17:39h

Desculpa ai, esqueci um detalhe ... o echo. Mas quanto ao linha ou "linha" no Debian tanto faz.
Quem le linha a linha é justamente o "while read linha".
Segue corrigido, e me avise se der errado.



while read linha
do
quant=`echo $linha | awk '{ print $1 }'`
if [ "$quant" -gt "5" ]; then
echo "rotina para enviar e-mail"
fi
done < /tmp/teste.txt

3. Re: Condição em consulta de arquivo [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 21/08/2009 - 13:43h

Seria alguma coisa +/- assim




while read linha
do
TESTE=`awk '{print $1}'`
if [ "$TESTE" -gt 5 ]; then
echo "rotina para enviar e-mail"
fi
done < /tmp/teste.txt


4. Re: Condição em consulta de arquivo [RESOLVIDO]

Daniel Fernandes
volcom

(usa Debian)

Enviado em 21/08/2009 - 13:55h

Obrigado!

Mas como eu dou a instrução para ler cada linha?

O parâmetro correto é:

while read "linha"

Agradeço!


5. Perfeito!

Daniel Fernandes
volcom

(usa Debian)

Enviado em 24/08/2009 - 09:07h

Amigo,

Perfeito!

Agora vou adaptar algumas coisas para enviar a mensagem no formato que preciso e em breve publico o Script aqui no VoL pra ajudar outras pessoas também!

Obrigado,

Daniel


6. Use AWK de novo

Newton Pasqualini Filho
NewtonMan

(usa Fedora)

Enviado em 17/09/2009 - 16:17h

Se você usar o AWK novamente vai conseguir fazer o filtro:
# mailq | grep ^[A-Z] | awk '{print $7}' | sort | uniq -c | awk '$1>3'

Acima se a primeira coluna (total de mensagens) for maior que 3 ele traz a linha

# mailq | grep ^[A-Z] | awk '{print $7}' | sort | uniq -c | awk '$1==3'

Acima é se o total for igual a 3

# mailq | grep ^[A-Z] | awk '{print $7}' | sort | uniq -c | awk '$1>=3'

Acima é se o total for maior ou igual a 3

# mailq | grep ^[A-Z] | awk '{print $7}' | sort | uniq -c | awk '$1>=3 {print $2}'

Acima é se o total for maior ou igual a 3 mostra a coluna de e-mail sozinha

espero ter ajudado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts