Como posso diferenciar dois arquivos de configuração?

14

Eu tenho dois arquivos snmpd.conf, um em um servidor que funciona e outro que não funciona. Como posso diferenciar os dois arquivos de configuração enquanto removo comentários irrelevantes e novas linhas?

    
por jldugger 29.05.2009 / 04:12

11 respostas

15
diff <(grep -v '^#' f1) <(grep -v '^#' f2)

Para evitar linhas em branco e linhas que contêm apenas espaços, além de linhas idênticas com uma única diferença de espaços iniciais adicionados ...

diff -b \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\
  <(grep -vE '^([ \t]*#|^[ \t]*$)' f2)

Nesse ponto, eu provavelmente colocaria isso em um script e escreveria algo como a sugestão original que é um pouco mais legível.

    
por 29.05.2009 / 04:29
19

Se você está confortável com vim , eu recomendo strongmente que você use vimdiff :

vimdiff file1 file2

Isso abrirá uma sessão vim com dois painéis, com um arquivo em cada lado. Destaques e cores indicarão diferenças entre os arquivos, e todas as partes idênticas serão ocultadas (dobradas, mas expansíveis).

Em seguida, se quiser mesclar seletivamente diferenças de um arquivo para outro, use os seguintes comandos:

(Considere o "arquivo atual" para ser aquele onde o cursor é)

^ W ^ W para alterar o foco da janela de um arquivo para a janela do outro arquivo

] c para avançar para o próximo bloco com diferenças

[c para reverter a pesquisa do bloco anterior com diferenças

faça ( d iff o btain) para trazer as mudanças do outro arquivo para o arquivo atual

dp ( d iff p ut) para enviar as alterações do arquivo atual para o outro arquivo

Observação: do e dp funcionam se você estiver em um bloco ou apenas uma linha em um bloco.

u para u ndo

zo para desdobrar / ocultar o texto

zc para voltar a dobrar / ocultar o texto

zr irá desdobrar os dois arquivos completamente (use : ajuda dobrada para mais informações sobre dobrar)

: diffupdate irá verificar novamente os arquivos em busca de alterações

À medida que você começa a mudar o texto alterado ou trazendo alterações, as partes agora idênticas dos arquivos também serão automaticamente desdobradas.

Quando terminar, você pode sair e gravar os dois arquivos com : xa!

Você também pode escrever, sair, descartar alterações, etc., um painel por vez, como faria normalmente com o vim.

Você pode usar todos os comandos comuns do vim para editar os arquivos à vontade; Eu só descrevi os comandos mais comuns e úteis que você provavelmente usará em uma sessão vimdiff (em oposição a um genérico do vim).

    
por 29.05.2009 / 04:56
6

Beyond Compare é a melhor ferramenta para isso!

Link: link

Disponível para Windows e Linux.

Jeff escreveu um bom artigo sobre a ferramenta por algum tempo: link

    
por 29.05.2009 / 05:01
5

Expandindo o one-liner do nima, você pode fazer isso como uma função shell e soltá-lo no seu .bashrc

diff <(grep -v '^#' f1) <(grep -v '^#' f2)

torna-se (usando -u porque eu gosto de diffs unificados)

function cleandiff {
  diff -u <(grep -v '^#' $1| grep -v '^ *$') <(grep -v '^#' $2 | grep -v '^ *$')
}

Se você gosta de visualizadores de diff da GUI, o meld é legal e entende arquivos / diretórios controlados pela revisão.

    
por 29.05.2009 / 09:17
4

Depois de limpar os comentários, aconselho-os a usar o KDiff3, é uma ferramenta muito boa de diff / merge e você não precisa do vim fu para usá-lo:)

    
por 29.05.2009 / 11:40
3

Pode haver uma maneira mais elegante de fazer isso, mas de forma pragmática (e rápida):

grep -v '^#' server1-snmpd.conf | grep -v '^ *$' > server1-snmpd.conf-clean
grep -v '^#' server2-snmpd.conf | grep -v '^ *$' > server2-snmpd.conf-clean
diff server1-snmpd.conf-clean server2-snmpd.conf-clean
    
por 29.05.2009 / 04:22
2

Se você estiver usando um shell tipo bash, tente isso:

# Name this diff-stripped
STRIPPED=
for i in $*; do
    egrep -v "^#|^\s*" "$i" > "$i.stripped"
    STRIPPED="$STRIPPED $i.stripped"
done

diff $STRIPPED

Em seguida, invoque-o assim:

 diff-stripped file1 file2 ...

Você também pode alterar diff para vimdiff ou gvimdiff , ambos com vim .

    
por 29.05.2009 / 05:26
2

Estendendo a solução Xerxes, você pode usar ferramentas mais sofisticadas do que diff para exibir as diferenças.

wdiff

wdiff pode ser "muito inteligente" às vezes, mas eu acho isso muito útil para dar uma rápida olhada nas diferenças entre os arquivos de configuração. Este script pode ser usado para saída com cores:

#!/bin/bash

RED=$'\e'"[1;31m"
GREEN=$'\e'"[1;32m"
RESET=$'\e'"[0m"
WDIFF_ARGS="-w$RED -x$RESET -y$GREEN -z$RESET --avoid-wraps"

wdiff $WDIFF_ARGS \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' $2) \
  | less -R

No Ubuntu e em outros sistemas baseados em Debian, apenas apt-get install wdiff antes de usar este script.

Meld

O Meld é uma boa alternativa à GUI, mas seu recurso "Filtragem de texto" apresenta alguns problemas. Em vez de usar filtragem de texto, removo os comentários completamente antes de mostrar os resultados no Meld. A desvantagem é perder a capacidade de editar os arquivos ao compará-los. Aqui está um script simples para usar o Meld:

#!/bin/bash

meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
     <(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
    
por 14.12.2010 / 22:11
2

Às vezes, várias linhas comuns adicionais podem ser removidas pela classificação de arquivos antes do diff, então eu adicionaria ao que já está escrito o seguinte:

 diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)

isso, é claro, faz sentido para os arquivos em que a ordem das linhas não afeta seu conteúdo (esteja ciente disso).

    
por 12.02.2012 / 19:10
1

Isto é o mesmo que o de uma linha, mas também irá filtrar linhas em branco  como alguém pediu.

diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2)

(Eu também instalaria o colordiff, se possível, e usaria isso no lugar do diff normal)

    
por 29.05.2009 / 22:04
1

Eu uso o WinMerge link para diferenciar os arquivos, já que tenho que puxá-los para a minha máquina, mas funciona.

    
por 29.05.2009 / 22:55