Em 16-03-2011 12:04, Eliane Franco escreveu:
Colega,
Este texto não segue um padrão de numero de linhas no log?
O ID pelo que entendi não repete, certo?
Sim, minha idéia inicial era localizar no arquivo de Log pela linha onde
existe algum tipo de erro e a partir dela (algumas linhas acima)
identificar o Id do Job e a partir daí selecionar todas as linhas do
Log, ou seja, por um início e pelo fim.
Meu olhar é simples, não de mestre. Então, penso que deveria
identificar o ID no texto. E fazer as contas da posicao inicial e
final, ja que saberia o numero de linhas...
Isso funcionaria, mas não é legal, pq obriga manter um padrão do
log... o correto é ter um inicio e fim identificado mesmo. Estou só
aprendendo tbem.
Este é o problema, pois nem sempre segue um padrão (de ter sempre o
mesmo número de linhas).
Abraços,
Eliane
Mas valeu pelo reply.
Abraço!
Em 14 de março de 2011 20:54, "Flávio R. Lopes"
<[email protected] <mailto:[email protected]>> escreveu:
Ok, obrigado Gabriel.
Estou "juntando" as idéias aqui com base na sugestão do pessoal.
Abraço,
Flávio
Em 14-03-2011 09:55, Gabriel Andrade de Santana escreveu:
2011/3/13 Tiago Peczenyj<[email protected]
<mailto:[email protected]>>:
Flavio
Imagine que vc quer imprimir todas as linhas entre uma
string X e outra Y.
Pode ser o começo e o fim de um StackTrace Java por
exemplo. Vc pode ter uma
"flag" $imprime quando encontra X e desliga quando encontra Y.
É uma maquina de estados pois vc tem 2 estados definidos:
"dentro" e "fora"
do que vc quer imprimir.
Esse tipo de comportamento, onde uma flag determina se estamos
dentro
ou fora de um intervalo, pode ser emulado utilizando o operador de
intervalo (..) quem em contexto escalar[1][2] age como um
flip-flop[3]
armazenando o estado booleano resultante das próximas avaliações.
Em if($linha =~ /foo/ .. $linha =~ /bar/) {} o resultado da
operação
será sempre verdadeiro a partir do momento em que $linha contiver
"foo" e assim permanecerá através das sucessivas chamadas até que
$linha contenha "bar" e então retornará falso NA PRÓXIMA
execução do
teste no bloco if.
A solução do Nelson poderia ser (porcamente) reescrita assim:
====
use strict;
use warnings;
my @buffer;
my $has_error;
while (<>) {
if ( /Starting/ .. /End/ ) { # ainda estamos entre
"Starting" e "End"?
$has_error = 1 if !$has_error&& m/FAIL|WARNING|ERROR/;
push @buffer, $_;
}
else {
send_email( \@buffer ), $has_error = 0 if $has_error;
@buffer = ();
}
}
====
$ perl script.pl <http://script.pl> arquivo.log
Aviso: esse código tem o intuito de somente demonstrar de forma
simplista o uso do operador supracitado e não figura como um
todo um
exemplo de boas práticas nem como solução definitiva para o
problema.
Cabendo, portanto, ao bom entendedor transformar em algo útil as
minhas meias-palavras. :)
[1] http://perldoc.perl.org/perlop.html#Range-Operators
[2] http://tinyurl.com/ybfanvv
[3] http://pt.wikipedia.org/wiki/Flip-flop
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
<mailto:[email protected]>
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
<mailto:[email protected]>
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer
=begin disclaimer
Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer