Як я можу відрізняти два конфігураційні файли?


15

У мене є два файли snmpd.conf, один на сервері, який працює, і один, який не працює. Як я можу розрізняти два конфігураційні файли, знімаючи невідповідні коментарі та нові рядки?


1
Слідкуйте за jldugger! Ви збираєтесь level! =)
Xerxes

Дійсно знімати коментарі, як ви знаєте, що вони не мають значення, не дивлячись на них?
AnonymousLurker

Відповіді:


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

Щоб уникнути порожніх рядків та рядків, що не містять нічого, крім пробілів, на додаток до однакових рядків, які мають єдину різницю доданих провідних пробілів ...

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

До цього моменту я б, мабуть, вклав це в сценарій і написав щось на зразок оригінальної пропозиції, яке трохи читабельніше.


+1 за надання однолінійного рішення
wzzrd

Будь-які ідеї, як пропустити рядки, що містять пробіл? Виявляється, коли ви вирізаєте коментарі, багато пустих рядків між ними.
jldugger

@jldugger, спробуйте оновити grep таким чином, щоб виключити коментарі та пробіли. - egrep -v '^ (#. * |) $'
Zoredache

19

Якщо вам подобається vim , я настійно рекомендую вам використовувати vimdiff :

vimdiff file1 file2

Це відкриє сеанс vim з двома панелями, з одним файлом на кожній стороні. Основні кольори та кольори означатимуть відмінності між файлами, а всі однакові частини будуть приховані (складені, але розширювані).

Потім, якщо ви хочете вибірково об'єднати відмінності від одного файла до іншого, ви можете скористатися такими командами:

(Розглянемо "поточний файл" таким, де знаходиться курсор)

^ W ^ W, щоб змінити фокус з вікна одного файлу на інше

] c, щоб перейти до наступного блоку з відмінностями

[c для зворотного пошуку попереднього блоку з відмінностями

do ( d iff o btain), щоб внести зміни з іншого файлу до поточного файлу

dp ( d iff p ut), щоб надіслати зміни з поточного файлу до іншого файлу

Примітка. І дію , і dp працюють, якщо ви перебуваєте в блоці або лише в одному рядку під блоком.

у к у ндо

zo, щоб розгорнути / приховати текст

zc, щоб повторно скласти / приховати текст

zr повністю розгорнуть обидва файли (використовуйте : допоможіть скласти докладніше про складання)

: diffupdate повторно сканує файли на предмет змін

Коли ви почнете переміщувати змінений текст або вносити зміни, тепер ідентичні частини файлів також автоматично згортаються.

Коли ви закінчите, ви можете закрити і записати обидва файли за допомогою : xa!

Ви також можете записувати, закривати, скасовувати зміни тощо, одночасно, як і в vim.

Ви можете використовувати всі загальні команди vim для редагування файлів за бажанням; Я описав лише найпоширеніші та корисні команди, які ви, ймовірно, використовуєте в сеансі vimdiff (на відміну від загального vim).


6

Більше порівняння - найкращий інструмент для цього!

Посилання: http://www.scootersoftware.com/

Доступно для Windows та Linux.

Джефф написав хорошу оглядову статтю про цей інструмент ще раз:
http://www.codinghorror.com/blog/archives/000454.html


Поза порівнянням - це приголомшливо!
Клінтон Блекмор

це доступно в * nix системах?
Преет Сангха

Beyond Compare 3 не працює як консольний додаток в Linux. Для цього потрібні X-Windows. Підтримувані дистрибутиви Linux (32-розрядні) Red Hat Enterprise Linux 4, 5 Fedora 4 - 10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3, 11 Ubuntu 6.06 - 8.10 Не перевірено Будь-яке 64-розрядне ядро ​​Linux Не сумісне Red Hat Enterprise Linux 3
Позначити Норгрен

Я більше не міг жити без цього інструменту! Екстремальна економія часу. Коли я перейшов з ПК на Mac близько 1 року тому, я дуже радий виявив, що його теж перенесли на Mac.
Jpsy

5

Розширюючи один-вкладиш nima, ви можете зробити це як функцію оболонки і перенести її у свій .bashrc

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

стає (використовуючи -у, тому що мені подобається уніфікований розріз)

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

Якщо вам подобається переглядач GUI diff, meld є приємним і розуміє редагування, керовані редакцією.


+1 за meld, який значно спростив графічний дифузійний sooo.
Avery Payne

4

Очистивши коментарі, я б радив використовувати KDiff3, це досить хороший інструмент для розмежування / злиття, і вам не потрібно vim fu, щоб використовувати його :)


3

Можливо, є більш елегантний спосіб зробити це, але прагматично (і швидко):

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

Якщо ви використовуєте bash-подібну оболонку, ви можете спробувати це:

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

diff $STRIPPED

Потім викликайте його так:

 diff-stripped file1 file2 ...

Ви також можете змінити або diffдо яких і те й інше .vimdiffgvimdiffvim


2

Розширюючи рішення Xerxes, ви можете використовувати більш складні інструменти, ніж diffдля відображення відмінностей.

wdiff

wdiffчасом може бути "занадто розумним", але мені здається, що це часто корисно для швидкого огляду відмінностей між файлами конфігурації. Цей сценарій можна використовувати для виведення кольорів:

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

На Ubuntu та інших системах на базі Debian, безпосередньо apt-get install wdiffперед використанням цього сценарію.

Форма

Meld є приємною альтернативою графічного інтерфейсу, але його функція "Фільтрація тексту" має деякі проблеми. Замість використання фільтрації тексту я взагалі видаляю коментарі, перш ніж показувати результати в Meld. Недоліком є ​​втрата можливості редагувати файли, порівнюючи їх. Ось простий сценарій використання Meld:

#!/bin/bash

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

2

Іноді кілька додаткових загальних рядків можна позбавити, сортуючи файли до розрізнення, тому я додам до того, що вже написано наступне:

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

це, звичайно, має сенс для файлів, де порядок рядків не впливає на його вміст (тому майте на увазі).


1

Це те саме, що одна вкладиша німи, але вона також фільтрує порожні рядки, як хтось просив.

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

(Я б також встановив colordiff, якщо можливо, і використаю його замість нормальної різниці)


1

Я використовую http://minmerge.org WinMerge для розходження файлів, якщо мені доведеться перетягувати їх на свою машину, але це працює для.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.