Назад | Перейти на главную страницу

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

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

Если вам комфортно с vim, Я настоятельно рекомендую вам использовать vimdiff:

vimdiff file1 file2

Это откроет сеанс vim с двумя панелями, по одному файлу с каждой стороны. Выделение и цвет будут указывать на различия между файлами, и все идентичные части будут скрыты (сложены, но могут быть расширены).

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

(Считайте, что «текущий файл» - это тот, где находится курсор)

^ W ^ W для переключения фокуса с окна одного файла на окно другого файла

] c перейти к следующему блоку с отличиями

[c обратный поиск предыдущего блока с отличиями

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

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

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

ты к тыndo

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

zc повторно свернуть / скрыть текст

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

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

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

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

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

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

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

Чтобы избежать пустых строк и строк, содержащих только пробелы, в дополнение к идентичным строкам, которые имеют единственное отличие добавленных ведущих пробелов ...

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

К этому моменту я бы, вероятно, поместил это в сценарий и написал что-то вроде исходного предложения, которое было бы немного более читабельным.

Beyond Compare - идеальный инструмент для этого!

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

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

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

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

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

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

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

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

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

Возможно, есть более элегантный способ сделать это, но прагматично (и быстро):

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

Если вы используете оболочку, похожую на 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.

Расширяя решение 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)

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

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

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

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

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

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

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