Como posso diferenciar dois arquivos de configuração?


15

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


1
Cuidado jldugger! Você está prestes a level! =)
Xerxes

É realmente uma péssima idéia remover os comentários, como você sabe que eles são irrelevantes sem olhar para eles?
AnonymousLurker

Respostas:


15
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 possuem uma única diferença de espaços à esquerda adicionados ...

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

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


1 para fornecer uma solução de linha única
wzzrd

Alguma idéia de como omitir linhas que contenham espaços em branco também? Acontece que, quando você corta os comentários, há muitas linhas em branco espaçando-os.
Jldugger

@ldldger, tente atualizar o grep para ficar assim, para excluir comentários e espaços em branco. - egrep -v '^ (#. * |) $'
Zoredache

19

Se você está um pouco à vontade com o vim , recomendo fortemente que você use o vimdiff :

vimdiff file1 file2

Isso abrirá uma sessão do vim com dois painéis, com um arquivo de 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 você deseja mesclar seletivamente as diferenças de um arquivo para outro, poderá usar os seguintes comandos:

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

^ W ^ W para mudar 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 inverter a pesquisa do bloco anterior com diferenças

fazer ( d sse o btain) para trazer mudanças de outro arquivo para o arquivo atual

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

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

u para u ndo

zo para desdobrar / ocultar texto

zc para dobrar / ocultar novamente o texto

O zr desdobra completamente os dois arquivos (use : help fold para saber mais sobre o fold)

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

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

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

Você também pode escrever, sair, 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; Descrevi apenas os comandos mais comuns e úteis que você provavelmente utilizará em uma sessão do vimdiff (em oposição a um genérico do vim).


6

Beyond Compare é a melhor ferramenta para isso!

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

Disponível para Windows e Linux.

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


Beyond Compare é incrível!
Clinton Blackmore

isso está disponível nos sistemas * nix?
Preet Sangha

O Beyond Compare 3 não é executado como um aplicativo de console no Linux. Requer X-Windows. Distribuições Linux suportadas (32 bits) Red Hat Enterprise Linux 4, 5 Fedora 4-10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3, 11 Ubuntu 6.06 - 8.10 Não testado Qualquer kernel Linux de 64 bits não compatível Red Hat Enterprise Linux 3
Mark Norgren

Eu não poderia mais viver sem essa ferramenta! Uma economia de tempo extrema. Quando mudei de PC para Mac há cerca de um ano, fiquei muito feliz ao descobrir que ele também havia sido portado para o Mac.
Jpsy

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 diferenças unificadas)

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

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


+1 para o meld, que tornou a diferença gráfica muito mais fácil.
Avery Payne

4

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


3

Pode haver uma maneira mais elegante de fazer isso, mas pragmaticamente (e rapidamente):

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

2

Se você estiver usando um shell semelhante ao bash, tente:

# 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 mudar diffpara vimdiffou com o gvimdiffqual ambos vêm vim.


2

Ao estender a solução da Xerxes, você pode usar ferramentas mais sofisticadas do que diffpara exibir as diferenças.

wdiff

wdiffàs vezes pode ser "muito inteligente", mas acho útil muitas vezes examinar rapidamente as 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 no Debian, pouco apt-get install wdiffantes de usar este script.

Meld

O Meld é uma boa alternativa à GUI, mas seu recurso "Filtragem de texto" tem alguns problemas. Em vez de usar a filtragem de texto, removo completamente 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

Às vezes, várias linhas comuns adicionais podem ser removidas classificando os arquivos antes do diff, então eu acrescentaria ao que já foi escrito o seguinte:

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

é claro que isso faz sentido para arquivos em que a ordem das linhas não afeta o conteúdo (lembre-se).


1

É o mesmo que o liner único do nima, mas também filtra as linhas em branco conforme solicitado por alguém.

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

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.