shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] melhorar script shell


From: SuSE List
Subject: Re: [shell-script] melhorar script shell
Date: Fri, 12 Nov 2004 14:36:29 -0200
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.2) Gecko/20040803

Caros shelleiros!!!!

Depois da ajuda do Fabio, fui estudar um pouco de sed|awk...e meu 
cerebro lentiuummmmm resolver funcionar...como o shell é eficiente!!!! e 
como estes comandos são poderosos!!!!

Dei uma mexida geral no meu shellzinho, baseado na sugestão do Fabio e 
olha como ele ficou:

# /home/vinicius/filtra
#!/bin/bash
cd /temp/pflog

# copia log de e-mail para arq temporario
cp /var/log/mail ./mail.tmp

# edita o mail.tmp, removendo os caracteres invalidos
sed 's/[<>,]//g; s/  / /g; s/: / /g;' mail.tmp > mail1.tmp

# extrai as linhas "from"
sed '/from.*size.*nrcpt/!d;' mail1.tmp | awk '{ print 
$1";"$2";"$3";"$6";"$7";"$8";"$9 }' > remetente.txt

# prepara as saida para a extrair pipe e smtp
sed -r -e '/(smtp\[|pipe)/!d; 
/(smtpd|anvil|warning|cleanup|root|connect)/d' mail1.tmp > to.tmp

# extrai as linhas "pipe|smtp" e formata o arquivo
awk 'BEGIN { print FILENAME; p = 0 }
     /smtp\[/              { p = 0 }
     /pipe/                { p = 1 }
     /pipe/ && /error/     { p = 2 }
     { if (p == 0) print $1";"$2";"$3";"$6";"$7";"$8";"$10 }
     { if (p == 1) print $1";"$2";"$3";"$6";"$8";"$9";"$11 }
     { if (p == 2) print $1";"$2";"$3";"$6";"$7";"$8";"$10 }
END  { print "" }' to.tmp > to1.tmp
#removendo linhas em branco deixados no arquivo
sed '/^$/d;' to1.tmp > destinatario.txt

# gerados 4 tmps, não consegui trabalhar com um apenas :-(
rm *.tmp

Ficou ótimo!!!!! Consegui reduzir o uso de cpu de 96% para 78% e o 
script, que inicialmente processava 60MB em 7:32 minutos, agora leva 
apenas 2:38 min!!!!!
Olhem minhas saidas:

# remetente.txt
Nov;12;12:26:37;C606D3307F;from=address@hidden;size=2905;nrcpt=2
Nov;12;12:26:55;094913E622;from=address@hidden;size=3340;nrcpt=1
Nov;12;12:26:56;C8656438F7;from=address@hidden;size=57118;nrcpt=2
Nov;12;12:27:15;BC7CD3B3AA;from=address@hidden;size=244255;nrcpt=1

# destinatarios.txt
Nov;12;12:38:00;06DF83AED1;to=address@hidden;relay=mail.gestetner.com.br[200.196.90.2];status=deferred
Nov;12;12:38:04;8CCEF39837;to=address@hidden;relay=mail.cunolatina.com[200.228.51.3];status=deferred
Nov;12;12:38:29;3939E41D44;orig_to=address@hidden;relay=cyrus;status=sent
Nov;12;12:38:30;3E371426DC;orig_to=address@hidden;relay=cyrus;status=sent

e inclusive, eu substitui pelo shell, três scripts em php que eu tinha 
pra gerar estes dois arquivos txt!!!! Agora so falta gravar em banco de 
dados...mas já tenho a soluçao quase pronta....

Só gostaria da ajuda em mais um quesito....vi um e-mail aqui na lista 
sobra manipulação de data.....se não me engano o Julio sugeriu o uso do case

case $Mes in
    Jan) Mes=01 ;;
    Feb) Mes=02 ;;
    Mar) Mes=03 ;;
...
esac

E o Miranda algo como

date +%d/%m/%Y -d"Oct 17"

Como faço para usar isso no script????

[]s

Marcus Vinicius


Fábio Batista wrote:

>Olha, me corrijam se eu estiver errado (o cérebro não anda mais
>funcionando tão bem a essa hora), mas vc pode simplificar as tuas
>inúmeras chamadas ao GREP e ao SED em algumas poucas. Até em uma só,
>mas meus conhecimentos de SED não me permitem chegar a escrever
>programas inteiros nele.
>
>Faça uns testes com este aqui: não pude como testar pq não tenho
>servidor de email instalado aqui, mas parece que deve resolver teu
>problema, se eu não cometi nenhum lapso ao traduzir os comandos:
>
>#!/bin/bash
>
>cd /tmp/pflog
>
># copia log de e-mail para arq temporario
>cp /var/log/mail ./mail.tmp
>
># edita o mail.tmp "inline", removendo os caracteres inválidos
>sed -i -f- mail.tmp << des
>  s/[<>,]//g;
>  s/  / /g;
>des
>
># extrai as linhas "from"
>sed -r -f- mail.tmp << des
>  /qmgr/!d;
>  /removed/d;
>des > from.txt
>
># prepara as saídas para a extração para pipe e smtp
>sed -r -i -f- mail.tmp << des
>  /(smtp|pipe)/!d;
>  /(smtpd|anvil|warning|cleanup|root)/d;
>des
>
># extrai as linhas "pipe"
>sed -r -f- mail.tmp << des
>  /pipe/!d;
>  /orig_to/!d;
>des > to_pipe.txt
>
># extrai as linhas "smtp"
>sed -r -f- mail.tmp << des
>  /(pipe|orig_to|connect|qmgr)/d;
>des > to_smtp.txt
>
># geramos só um .tmp
>rm mail.tmp
>
>Fábio David Batista
>address@hidden
>http://fabiobatista.multiply.com
>
>On Wed, 10 Nov 2004 16:58:48 -0200, SuSE List <address@hidden> wrote:
>  
>
>> Caros amigos,
>> 
>> Estou com o seguinte problema e gostaria de saber se podem me ajudar....
>> 
>> Estou precisando desenvolver uma aplicação que me gere relatórios sobre 
>> uso do serviço de e-mail, mais especificamente quero saber quanto cada 
>> usuário trafega em meu servidor....Criar a aplicação não é o 
>> problema.....meu problema reside em fazer algo em shell para tratar a 
>> log de e-mail de um server postfix.....eu fiz um shell muito arcaico 
>> (pois sou novo em shell) que me trata uma log de uns 500MB mais ou 
>> menos....porem ela demora quase 30 minutos pra terminar o 
>> trabalho...atende? sim, me atende no que preciso, mas gostaria que me 
>> ajudassem a melhorar este shell e inclusive minimizar o tempo de 
>> processamento, pois qdo executo meu shell, minha CPU vai lá no céu 
>> deixando tudo muito lento....
>> 
>> Eis o meu script, por favor, sem muitas risadas, sei que é arcaico e 
>> grosseiro :-P
>> 
>> #!/bin/bash
>> cd /tmp/pflog
>> # Copia log de e-mail para arq temporario
>> cp /var/log/mail ./mail.tmp
>> # elimina caracteres invalidos "<>," . Ex: 
>> from=<address@hidden>, size=802100, nrcpt=1
>> # ficando apenas from=address@hidden size=802100 nrcpt=1
>> # pois uso o "espaço" como caracter separador de campos
>> cat mail | sed "s/[<>,]//g" > mail1
>> rm mail
>> # trata espaços duplos em data. Ex. "Oct %%1" pois "Oct%10" só tem um 
>> espaço (%)....
>> cat mail1 | sed "s/  / /g" > mail
>> # traz apenas registros validos de from....Ex:
>> # Nov  7 09:49:29 msp01 postfix/qmgr[22896]: B5306D5F7: 
>> from=<address@hidden>, size=802100, nrcpt=1 (queue active)
>> grep qmgr < ./mail > temp.tmp
>> grep -v removed < ./temp.tmp > from.txt
>> # traz registros validos do tipo "para"
>> egrep "smtp|pipe" < ./mail > temp1.tmp
>> grep -v smtpd < temp1.tmp > temp2.tmp
>> grep -v anvil < temp2.tmp > temp3.tmp
>> grep -v warning < temp3.tmp > temp4.tmp
>> egrep -v "cleanup|root" < temp4.tmp > temp5.tmp
>> grep pipe < temp5.tmp > temp6.tmp
>> grep orig_to < temp6.tmp > to_pipe.txt
>> egrep -v "pipe|orig_to|connect|qmgr" < temp5.tmp > to_smtp.txt
>> rm *.tmp
>> 
>> Ate aqui normal...consigo extrair a informação que preciso....porem 
>> queria melhorar isso.....e trazer somente as linhas que eu preciso como 
>> no exemplo abaixo:
>> 
>> Para e-mail de origem, eu tenho a log:
>> 
>> Nov  7 10:06:49 msp01 postfix/qmgr[22896]: A47DA390E6: 
>> from=<address@hidden>, size=11644, nrcpt=1 (queue active)
>> 
>> e queria somente obter isto em um arquivo txt, por exemplo:
>> 
>> Nov;7;10:06:49;A47DA390E6;from=address@hidden>;size=11644;nrcpt=1
>> 
>> e para e-mail de destino eu tenho duas situações:
>> 
>> Nov  7 10:06:49 msp01 postfix/pipe[25709]: A47DA390E6: 
>> to=<address@hidden>, orig_to=<address@hidden>, 
>> relay=cyrus, delay=6, status=sent (mail.mispo.com.br)
>> 
>> Nov  7 12:23:59 msp01 postfix/smtp[8726]: CA67A21FB1: 
>> to=<address@hidden>, relay=mx.uol.com.br[200.221.11.51], delay=1, 
>> status=sent (250 Ok: queued as 133A87C188)
>> 
>> e eu gostaria de ter como saida apenas isto:
>> 
>>Nov;7;10:06:49;A47DA390E6;orig_to=address@hidden>;relay=cyrus;status=sent
>>Nov;7;12:23:59;CA67A21FB1;to=address@hidden;relay=mx.uol.com.br[200.221.11.51];status=sent
>> 
>> 
>> Isso é possível?? Alguém pode me ajudar?
>> 
>> Desculpem pelo e-mail longo.....
>> 
>> []s
>> 
>> Marcus Vinicius
>> 
>>
>>    
>>



[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]