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?
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?
Réponses:
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.
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).
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
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.
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 :)
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
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 diff
pour vimdiff
ou gvimdiff
avec les deux vim
.
En étendant la solution de Xerxes, vous pouvez utiliser des outils plus sophistiqués que diff
pour afficher les différences.
wdiff
peut ê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 wdiff
avant d'utiliser ce script.
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)
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).
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.
level
! =)