Как я могу различить два файла конфигурации?

15

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

jldugger
источник
1
Берегись jldugger! Вы собираетесь level! =)
Ксеркс
Это действительно плохая идея, чтобы раздавать комментарии, откуда вы знаете, что они не имеют значения, не глядя на них?
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 для обратного поиска предыдущего блока с различиями

делать ( d тогда и только тогда о btain) , чтобы изменения из другого файла в текущий файл

dp ( d iff p ut) для отправки изменений из текущего файла в другой файл

Примечание: оба делают и dp работают, если вы находитесь в блоке или только одна строка под блоком.

у к у NDo

zo развернуть / скрыть текст

ZC, чтобы сложить / повторно скрыть текст

zr полностью развернет оба файла (используйте : help fold для более подробной информации о сворачивании)

: diffupdate повторно проверит файлы на наличие изменений

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

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

Вы также можете написать, выйти, отменить изменения и т. Д. По одной панели за раз, как вы это обычно делаете с vim.

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

rgmarcha
источник
6

Beyond Compare - лучший инструмент для этого!

Ссылка: http://www.scootersoftware.com/

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

Некоторое время назад Джефф написал хорошую обзорную статью об инструменте:
http://www.codinghorror.com/blog/archives/000454.html

Марк Норгрен
источник
Beyond Compare - это круто!
Клинтон Блэкмор
это доступно в * 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
Mark Норгрен
Я не мог жить без этого инструмента больше! Экстремальная экономия времени. Когда я перешел с ПК на Mac около 1 года назад, я был очень рад обнаружить, что он только что был перенесен и на Mac.
Jpsy
5

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

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

становится (используя -u, потому что мне нравятся унифицированные различия)

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

Если вам нравятся средства просмотра различий в GUI, meld хорош, и он понимает файлы / каталоги, контролируемые ревизиями.

Роб Чантер
источник
+1 для слияния, что значительно облегчает графическое различие.
Эйвери Пейн
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
jj33
источник
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на vimdiffили с gvimdiffобоими vim.

Нил
источник
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. Недостатком является потеря возможности редактировать файлы при их сравнении. Вот простой скрипт для использования Meld:

#!/bin/bash

meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
     <(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
akaihola
источник
2

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

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

это, конечно, имеет смысл для файлов, где порядок строк не влияет на их содержимое (так что имейте это в виду).

Oriettaxx
источник
1

Это то же самое, что один вкладыш Нимы, но он будет отфильтровывать пустые строки, как кто-то просил.

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

(Я бы также установил colordiff, если это возможно, и использовал бы его вместо обычного diff)

отметка
источник
1

Я использую WinMerge http://winmerge.org для сравнения файлов, при условии , что мне нужно перенести их на свою машину, но это работает для.

steve.lippert
источник