Uma maneira fácil de comparar arquivos de log, ignorando os carimbos de data e hora?
Pergunta
Preciso diferenciar dois arquivos de log, mas ignorar a parte do carimbo de data/hora de cada linha (os primeiros 12 caracteres para ser exato).Existe uma boa ferramenta, ou um comando awk inteligente, que possa me ajudar?
Outras dicas
@EbGreen disse
Eu apenas pegaria os arquivos de log e retiraria os carimbos de data e hora do início de cada linha e salvaria o arquivo em arquivos diferentes.Em seguida, compare esses arquivos.
Essa é provavelmente a melhor aposta, a menos que sua ferramenta de comparação tenha poderes especiais.Por exemplo, você poderia
cut -b13- file1 > trimmed_file1
cut -b13- file2 > trimmed_file2
diff trimmed_file1 trimmed_file2
Veja a resposta do @toolkit para uma otimização que torna isso uma linha única e evita a necessidade de arquivos extras.Se o seu shell suportar.Bash 3.2.39 pelo menos parece ...
Respostas usando cut
estão bem, mas às vezes mantendo carimbos de data e hora dentro do diff
a produção é apreciável.Como a pergunta do OP é sobre ignorando os carimbos de hora (sem removê-los), compartilho aqui minha linha de comando complicada:
diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
sed
isola os carimbos de data/hora (#
antes e\n
depois) dentro de um substituição de processodiff -I '^#'
ignora linhas com esses carimbos de data e hora (linhas começando por#
)
exemplo
Dois arquivos de log com o mesmo conteúdo, mas carimbos de data/hora diferentes:
$> for ((i=1;i<11;i++)) do echo "09:0${i::1}:00.000 data $i"; done > 1.log
$> for ((i=1;i<11;i++)) do echo "11:00:0${i::1}.000 data $i"; done > 2.log
Básico diff
a linha de comando diz que todas as linhas são diferentes:
$> diff 1.log 2.log
1,10c1,10
< 09:01:00.000 data 1
< 09:02:00.000 data 2
< 09:03:00.000 data 3
< 09:04:00.000 data 4
< 09:05:00.000 data 5
< 09:06:00.000 data 6
< 09:07:00.000 data 7
< 09:08:00.000 data 8
< 09:09:00.000 data 9
< 09:01:00.000 data 10
---
> 11:00:01.000 data 1
> 11:00:02.000 data 2
> 11:00:03.000 data 3
> 11:00:04.000 data 4
> 11:00:05.000 data 5
> 11:00:06.000 data 6
> 11:00:07.000 data 7
> 11:00:08.000 data 8
> 11:00:09.000 data 9
> 11:00:01.000 data 10
Nosso complicado diff -I '^#'
não exibe nenhuma diferença (carimbos de data e hora ignorados):
$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
$>
Mudar 2.log
(substituir data
por foo
na 6ª linha) e verifique novamente:
$> sed '6s/data/foo/' -i 2.log
$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
11,13c11,13
11,13c11,13
< #09:06:00.000
< data 6
< #09:07:00.000
---
> #11:00:06.000
> foo 6
> #11:00:07.000
=> timestamps são mantidos no diff
saída!
Você também pode usar o lado a lado recurso usando -y
ou --side-by-side
opção:
$> diff -y -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
#09:01:00.000 #11:00:01.000
data 1 data 1
#09:02:00.000 #11:00:02.000
data 2 data 2
#09:03:00.000 #11:00:03.000
data 3 data 3
#09:04:00.000 #11:00:04.000
data 4 data 4
#09:05:00.000 #11:00:05.000
data 5 data 5
#09:06:00.000 | #11:00:06.000
data 6 | foo 6
#09:07:00.000 | #11:00:07.000
data 7 data 7
#09:08:00.000 #11:00:08.000
data 8 data 8
#09:09:00.000 #11:00:09.000
data 9 data 9
#09:01:00.000 #11:00:01.000
data 10 data 10
velho sed
Se seu sed
implementação não apoia a -r
opção, você pode ter que contar os doze pontos <(sed 's/^\(............\)/#\1\n/' 1.log)
ou use outro padrão de sua preferência ;)
Para uma opção gráfica, Combinar pode fazer isso usando seu filtros de texto recurso.
Permite ignorar linhas baseadas em um ou mais regex python.As diferenças ainda aparecem, mas as linhas que não possuem outras diferenças não serão destacadas.
Usar Kdiff3 e em Configurar>Diferença editar "Comando do pré-processador de correspondência de linha" para algo como:
sed "s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//"
Isso filtrará os carimbos de data/hora do algoritmo de alinhamento de comparação.
Kdiff3 também permite que você alinhar manualmente linhas específicas.