Comment puis-je différencier deux fichiers de configuration?

15

J'ai deux fichiers snmpd.conf, un sur un serveur qui fonctionne et un qui ne fonctionne pas. Comment puis-je différencier les deux fichiers de configuration tout en supprimant les commentaires et les nouvelles lignes non pertinents?

jldugger
la source
1
Attention jldugger! Vous êtes sur le point de le faire level! =)
Xerxès
C'est vraiment une mauvaise idée de supprimer les commentaires, comment savez-vous qu'ils ne sont pas pertinents sans les regarder?
AnonymousLurker

Réponses:

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

Pour éviter les lignes vides et les lignes ne contenant que des espaces, en plus des lignes identiques qui ont une seule différence d'espaces de tête ajoutés ...

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

À ce stade, je mettrais probablement cela dans un script et j'écrirais quelque chose comme la suggestion originale qui est un peu plus lisible.

Xerxès
la source
+1 pour la fourniture d'une solution
monoligne
Des idées sur la façon d'omettre également les lignes contenant des espaces? S'avère une fois que vous avez coupé les commentaires, il y a beaucoup de lignes vides qui les espacent.
jldugger
@jldugger, essayez de mettre à jour le grep pour qu'il ressemble à ceci afin d'exclure les commentaires et les espaces. - egrep -v '^ (#. * |) $'
Zoredache
19

Si vous êtes un peu à l'aise avec vim , je vous encourage fortement à utiliser vimdiff :

vimdiff file1 file2

Cela ouvrira une session vim avec deux volets, avec un fichier de chaque côté. Les hautes lumières et la couleur indiqueront les différences entre les fichiers, et toutes les parties identiques seront cachées (pliées, mais extensibles).

Ensuite, si vous souhaitez fusionner de manière sélective les différences d'un fichier à l'autre, vous pouvez utiliser les commandes suivantes:

(Considérez que le "fichier actuel" est celui où se trouve le curseur)

^ W ^ W pour changer le focus d'une fenêtre de fichier à l'autre fenêtre de fichier

] c pour passer au bloc suivant avec des différences

[c pour inverser la recherche du bloc précédent avec des différences

faire ( d iff o btenir) pour apporter des changements de l'autre fichier dans le fichier en cours

dp ( d ssi p ut) pour envoyer les modifications du fichier actuel vers l'autre fichier

Remarque: les fonctions do et dp fonctionnent si vous êtes sur un bloc ou juste une ligne sous un bloc.

tu à u ndo

zo pour déplier / masquer le texte

zc pour replier / masquer le texte

zr dépliera complètement les deux fichiers (utilisez : aidez à plier pour en savoir plus sur le pliage)

: diffupdate analysera à nouveau les fichiers pour les changements

Lorsque vous commencez à déplacer du texte modifié ou à y apporter des modifications, les parties désormais identiques des fichiers se replient automatiquement également.

Lorsque vous avez terminé, vous pouvez quitter et écrire les deux fichiers avec : xa!

Vous pouvez également écrire, quitter, ignorer les modifications, etc., un volet à la fois, comme vous le feriez normalement avec vim.

Vous pouvez utiliser toutes les commandes vim courantes pour éditer les fichiers à volonté; Je n'ai décrit que les commandes les plus courantes et les plus utiles que vous êtes susceptible d'utiliser dans une session vimdiff (par opposition à une session générique vim).

rgmarcha
la source
6

Beyond Compare est l'outil ultime pour cela!

Lien: http://www.scootersoftware.com/

Disponible pour Windows et Linux.

Jeff a écrit un bon article de synthèse sur l'outil il y a quelque temps:
http://www.codinghorror.com/blog/archives/000454.html

Mark Norgren
la source
Beyond Compare est génial!
Clinton Blackmore
est-ce disponible sur les systèmes * nix?
Preet Sangha
Beyond Compare 3 ne fonctionne pas comme une application console sous Linux. Il nécessite X-Windows. Distributions Linux prises en charge (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 Non testé Tout noyau Linux 64 bits Non compatible Red Hat Enterprise Linux 3
Mark Norgren
Je ne pourrais plus vivre sans cet outil! Un gain de temps extrême. Lorsque je suis passé de PC à Mac il y a environ 1 an, j'étais très heureux de constater qu'il venait tout aussi d'être porté sur Mac.
Jpsy
5

En développant le one-liner de nima, vous pouvez le faire comme une fonction de coque et le déposer dans votre .bashrc

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

devient (en utilisant -u parce que j'aime les différences unifiées)

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

Si vous aimez les visualiseurs de différences GUI, meld est agréable et comprend les répertoires / fichiers contrôlés par les révisions.

Rob Chanter
la source
+1 pour la fusion, ce qui a rendu la différenciation graphique beaucoup plus facile.
Avery Payne,
4

Après avoir nettoyé les commentaires, je conseillerais d'utiliser KDiff3, c'est un très bon outil de diff / fusion et vous n'avez pas besoin de vim fu pour l'utiliser :)


la source
3

Il pourrait y avoir une façon plus élégante de le faire, mais de manière pragmatique (et rapide):

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
jj33
la source
2

Si vous utilisez un shell de type bash, vous pouvez essayer ceci:

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

diff $STRIPPED

Ensuite, invoquez-le comme ceci:

 diff-stripped file1 file2 ...

Vous pouvez également changer diffpour vimdiffou gvimdiffavec les deux vim.

Neil
la source
2

En étendant la solution de Xerxes, vous pouvez utiliser des outils plus sophistiqués que diffpour afficher les différences.

wdiff

wdiffpeut être «trop intelligent» parfois, mais je le trouve souvent utile pour jeter un rapide coup d'œil aux différences entre les fichiers de configuration. Ce script peut être utilisé pour la sortie avec des couleurs:

#!/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

Sur Ubuntu et d'autres systèmes basés sur Debian, juste apt-get install wdiffavant d'utiliser ce script.

Meld

Meld est une alternative intéressante à l'interface graphique, mais sa fonction de "filtrage de texte" a quelques problèmes. Au lieu d'utiliser le filtrage de texte, je supprime complètement les commentaires avant d'afficher les résultats dans Meld. L'inconvénient est de perdre la possibilité de modifier les fichiers tout en les comparant. Voici un script simple pour utiliser Meld:

#!/bin/bash

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

Parfois, plusieurs lignes communes supplémentaires peuvent être supprimées en triant les fichiers avant le diff, donc j'ajouterais à ce qui est déjà écrit ce qui suit:

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

cela a bien sûr un sens pour les fichiers où l'ordre des lignes n'affecte pas son contenu (alors soyez conscient).

Oriettaxx
la source
1

C'est la même chose que la doublure de nima, mais elle filtrera également les lignes vierges comme quelqu'un l'a demandé.

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

(J'installerais également colordiff si possible et l'utiliserais à la place du diff normal)

marque
la source
1

J'utilise WinMerge http://winmerge.org pour différencier les fichiers, étant donné que je dois les tirer vers le bas sur ma machine, mais cela fonctionne pour.

steve.lippert
la source