Existe um formato diff condensado lado a lado?

40

Eu tenho dois arquivos de log com milhares de linhas. Após o pré-processamento, apenas algumas linhas diferem. Essas linhas restantes são diferenças reais ou grupos de linhas embaralhadas.

As diferenças unificadas permitem-me ver as diferenças detalhadas, mas dificulta a comparação manual com os olhos. As diferenças lado a lado parecem mais úteis para comparação, mas também adicionam milhares de linhas inalteradas. Existe uma maneira de obter a vantagem dos dois mundos?

Observe que esses arquivos de log são gerados pelo xscopequal é um programa que monitora os dados do protocolo Xorg. Estou procurando ferramentas de uso geral que possam ser aplicadas a situações semelhantes às anteriores, por exemplo, ferramentas de análise de log de acesso a servidores web não especializadas.


Dois exemplos de arquivos de log estão disponíveis em http://lekensteyn.nl/files/qemu-sdl-debug/ ( log13e log14). Um comando de pré-processador pode ser encontrado no xscope-filterarquivo que remove os carimbos de data e hora e outros detalhes menores.

Lekensteyn
fonte
2
O seu difftem --suppress-common-linesopção? pastebin.com/KZrVCNFR
manatwork
1
@manatwork Bom, é verdade. Alguma maneira de adicionar mais contexto (por exemplo, números de linha)?
Lekensteyn
5
Então talvez vimdiff(do pacote vim ) atenda melhor às suas necessidades: exibição paralela, colorida, linhas comuns dobradas. Os números de linha podem ser ativados com :set number.
manatwork
Eu acho que você deve colocar vimdiff-se como uma resposta :)
Kotte
1
As ferramentas CLI são preferidas, mas as ferramentas GUI também são permitidas se forem pequenas o suficiente. Eu tentei o kdiff3, mas ele ainda produziu muitos detalhes. Idealmente, não vejo todos os detalhes desnecessários. Vou anexar dois conjuntos de dados.
Lekensteyn

Respostas:

37

As duas ferramentas diff que eu mais uso seriam meld e sdiff .

fundir

O Meld é uma GUI, mas faz um ótimo trabalho ao mostrar as diferenças entre os arquivos. Ele é mais voltado para o desenvolvimento de software com recursos como a capacidade de mover alterações de um lado para o outro para mesclar alterações, mas pode ser usado apenas como uma ferramenta de diferenciação direta lado a lado.

    ss de meld

    ss do destaque do código de fusão

sdiff

Eu uso essa ferramenta há anos. Geralmente, eu o executo com as seguintes opções:

$ sdiff -bBWs file1 file2
  • -b Ignore as alterações na quantidade de espaço em branco.
  • -W Ignore todo o espaço em branco.
  • -B Ignore as alterações cujas linhas estão todas em branco.
  • -s Não produza linhas comuns.

Geralmente, com os arquivos de log, é necessário aumentar a largura das colunas; você pode usar -w <num>para aumentar a tela.

outras ferramentas que eu uso de vez em quando

diffc

Diffc é um script python que colore a saída diff unificada.

$ diffc [OPTION] FILE1 FILE2

             ss de diffc

vimdiff

O Vimdiff é provavelmente tão bom se não melhor que o meld e pode ser executado a partir de um terminal. Eu sempre esqueço de usá-lo, o que, para mim, é um bom indicador de que acho a ferramenta um pouco difícil de usar no dia a dia. Mas YMMV.

                                    ss de vimdiff

slm
fonte
1
Um ótimo recurso do Meld, infelizmente não visível na tela, é o destaque da sintaxe dos arquivos de código-fonte.
manatwork
Sim. Eu costumava usar o vimdiff o tempo todo, desde que passei a usar o meld, acho mais fácil de usar e é mais fácil ver o que está me dizendo do que o vimdiff.
Slm
@manatwork - adicionou seu link à resposta, obrigado pelo feedback!
Slm
1
Parece ótimo para o código-fonte, mas não tanto para comparar arquivos de log. Costumo usar a colordiffpartir de colordiff.org para arquivo de origem. No meu entender, sdiffé semelhante a diff -ysem diferenças na produção, mas com opções ligeiramente diferentes. +1 por mostrar algumas boas alternativas ao diff simples.
Lekensteyn
Eu nunca usei colordiff, vou ter que dar uma olhada. Você está correto no diff -y. A adição dessa mudança para diffparece ter acontecido em algum momento, ou eu nunca percebi. Além disso, aqui está um link para a página de recursos das ferramentas gnu diff . Coisas boas para usar este conjunto de ferramentas.
slm
20

Atualmente estou usando o diff lado a lado com grep filtrando as diferentes linhas:

diff -y -W250 log.txt log2.txt | expand | \
    grep -E -C3 '^.{123} [|<>]( |$)' | colordiff | less -rS
  • A opção -W250aumenta a saída, de forma que eu possa ver mais dados.
  • expand é necessário converter abas em espaços
  • -C3 adiciona 3 linhas de contexto à saída grep.
  • ^.{123} corresponde à metade dos dados antes dos marcadores de diferenças lado a lado.
  • colordiff torna a saída mais bonita a seguir
  • less -rSpermite que as cores ANSI sejam interpretadas ( -r) e evita linhas quebradas ( -S).

Isso é um truque, alternativas são bem-vindas.

Lekensteyn
fonte
1
Isso é maravilhoso.
Pat Myron
Boa ideia. Infelizmente, o grepregex é muito lento. Também difftem uma -topção para expandir as guias.
Timmmm
12

Ninguém mencionou icdiff ainda? É ótimo! Pic fala por si: icdiff

Radek Postołowicz
fonte
Esta é uma ferramenta muito elegante, também disponível no aur.
Uzumaki D. Ichigo
Muito lento para arquivos grandes.
Timmmm
0

O comando linux "sdiff" mostra diferenças lado a lado, por padrão, incluindo todas as linhas, mas você pode usar várias opções para mostrar apenas diferenças:

sdiff -tWBs -w $COLUMNS config.xml config.xml.original

Onde

-t: traduz abas em espaços

-W: ignora diferenças de espaço em branco

-B: ignora linhas em branco

-s: ignora as linhas iguais

-w $ COLUMNS: usa largura total da tela

As linhas mostradas serão divididas por |, <ou> - consulte a documentação ou tente apenas.

Moshe Yudkowsky
fonte