it-swarm-pt.tech

Como posso diferenciar dois arquivos de configuração?

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?

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

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

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

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

15
Xerxes

Se você se sente confortável com vim, recomendo fortemente que você use vimdiff:

vimdiff file1 file2

Isso abrirá uma sessão do vim com dois painéis, com um arquivo em cada lado. Os realces e a cor 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 as diferenças de um arquivo para outro, você pode usar os seguintes comandos:

(Considere o "arquivo atual" como aquele onde o cursor está)

^ W ^ W para mudar o foco de uma janela de arquivo para a janela de outro arquivo

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

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

fazer (d iff o btain) para trazer as alterações do outro arquivo para o arquivo atual

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

Nota: Ambos fazer e dp funcionam se você estiver em um bloco ou apenas uma linha abaixo de um bloco.

para ndo

zo para desdobrar/revelar texto

zc para dobrar/ocultar novamente o texto

zr desdobrará ambos os arquivos completamente (use : help fold para mais informações sobre dobrar)

: diffupdate irá verificar novamente os arquivos para alterações

Conforme você começa a mover o texto alterado ou trazendo as alterações, as partes agora idênticas dos arquivos serão automaticamente dobradas também.

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

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

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

19
rgmarcha

Beyond Compare é a ferramenta definitiva para isso!

Link: http://www.scootersoftware.com/

Disponível para Windows e Linux.

Jeff escreveu um bom artigo de visão geral sobre a ferramenta há algum tempo:
http://www.codinghorror.com/blog/archives/000454.html

6
Mark Norgren

Expandindo o one-liner do nima, você poderia fazer isso como uma função Shell e soltá-la em seu .bashrc

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

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

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

Se você gosta de visualizadores de diferenças de GUI, meld é bom e entende diretórios/arquivos controlados por revisão.

5
Rob Chanter

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

4
Kosta

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
3
jj33

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

wdiff

wdiff pode ser "muito inteligente" às ​​vezes, mas geralmente acho que é útil para dar uma olhada rápida 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 outros sistemas baseados em Debian, apenas apt-get install wdiff antes de usar este script.

Meld

Meld é uma boa alternativa de GUI, mas seu recurso de "Filtragem de texto" tem alguns problemas. Em vez de usar a filtragem de texto, eu removo todos os comentários antes de mostrar os resultados no Meld. A desvantagem é perder a capacidade de editar os arquivos enquanto os compara. Aqui está um script simples para usar o Meld:

#!/bin/bash

meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
     <(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
2
akaihola

Se estiver usando um Shell semelhante ao bash, você pode tentar isto:

# 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, que vêm com vim.

2
Neil

Às vezes, várias linhas comuns adicionais podem ser removidas classificando os 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 arquivos onde a ordem das linhas não afeta seu conteúdo (portanto, esteja ciente).

2
Oriettaxx

Eu uso o WinMerge http://winmerge.org para diff arquivos, embora eu tenha que puxá-los para a minha máquina, mas funciona para.

1
steve.lippert

Este é o mesmo que o único liner de nima, mas também filtrará as linhas em branco conforme solicitado.

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

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

1
Mark