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?
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?
Respostas:
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.
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).
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
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.
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 :)
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
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 diff
para vimdiff
ou com o gvimdiff
qual ambos vêm vim
.
Ao estender a solução da Xerxes, você pode usar ferramentas mais sofisticadas do que diff
para exibir as diferenças.
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 wdiff
antes de usar este script.
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)
À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).
Eu uso o WinMerge http://winmerge.org para arquivos diff, desde que eu tenha que puxá-los para a minha máquina, mas funciona.
level
! =)