Solaris encontra a linha de registro anterior

2

Estamos executando o Solaris 10 no trabalho. O que eu gostaria de fazer é encontrar a linha anterior a outra linha.

Exemplo real ao vivo. Eu posso descobrir que alguns dos nossos pedidos estão expirando com a seguinte consulta.

grep timeout log.log.

Isso me dá algo parecido com:

2010-11-30 20:59:57,495 ERROR [82.69.73.87 - 342E15CB9651927BE715780FC40DEC53 - 3675058] Send Call (AbstractEngineServlet.java:288) > - Merchant error HTTPS Comms found. Merchant Trans Id: 22283845800 The host did not accept the connection within timeout of 60000 ms

No entanto, nos arquivos de log, mas pode haver várias linhas anteriores que registramos para chamar

2010-11-30 20:56:57,495 INFO [82.69.73.87 - 342E15CB9651927BE715780FC40DEC53 - 3675058] about to call http://www.example.com

Então, o que eu gostaria de fazer é identificar todos os tempos limite e, em seguida, identificar todas as linhas "sobre chamadas" que são diretamente anteriores e possuem o mesmo endereço IP ou sessão.

No exemplo acima, seria encontrar a linha anterior contendo "342E15CB9651927BE715780FC40DEC53" isso é possível com as ferramentas de shell padrão?

    
por Wes 30.11.2010 / 22:18

3 respostas

1

Isto parece um trabalho para o awk. Supondo que seus logs sejam suficientemente regulares (em particular, estou extraindo o cookie de sessão como o 6º campo):

<foo.log awk '
  /about to call/ {target[$6]=$0;}
  /AbstractEngineServlet.*timeout/ {print target[$6]; print;}
'
    
por 30.11.2010 / 22:45
0
for i in 'grep timeout log.txt|awk '{print $6}'';
do
  grep $i log.txt;
  echo "-----------------";
done
    
por 30.11.2010 / 22:33
0

Não testado, mas algo como

#!/usr/bin/env perl

my %lastline;

while (<>) {
    if (/\b([[:xdigit:]]{32})\b/) {
        if (/INFO/) {
            $lastline{$1} = $_;
        }
        elsif (/ERROR/) {
            print delete $lastline{$1} if exists $lastline{$1};
            print;
        }
    }
}

provavelmente funciona.

    
por 30.11.2010 / 22:45