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?

Foi útil?

Solução

Dependendo do shell que você está usando, você pode mudar a abordagem @Blair sugerido em uma linha

diff <(cut -b13- file1) <(cut -b13- file2)

(+1 a @Blair pela sugestão original :-)

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 processo
  • diff -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 diffsaí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.

Example configuration

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top