У меня есть два файла snmpd.conf, один на работающем сервере, а другой нет. Как я могу различить два файла конфигурации, удаляя ненужные комментарии и переводы строк?
У меня есть два файла snmpd.conf, один на работающем сервере, а другой нет. Как я могу различить два файла конфигурации, удаляя ненужные комментарии и переводы строк?
Ответы:
diff <(grep -v '^#' f1) <(grep -v '^#' f2)
Чтобы избежать пустых строк и строк, содержащих только пробелы, в дополнение к одинаковым строкам, которые имеют единственное отличие от добавленных начальных пробелов ...
diff -b \
<(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\
<(grep -vE '^([ \t]*#|^[ \t]*$)' f2)
К этому моменту я, вероятно, поместил бы это в сценарий и написал бы что-то вроде оригинального предложения, которое было бы немного более читабельным.
Если вы в некоторой степени довольны 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).
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 '^ *$')
}
Если вам нравятся средства просмотра различий в GUI, 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
время от времени может быть «слишком умным», но я часто нахожу это полезным, чтобы быстро взглянуть на различия между файлами конфигурации. Этот скрипт можно использовать для вывода с цветами:
#!/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)
Иногда, несколько дополнительных общих строк могут быть удалены путем сортировки файлов перед diff, поэтому я бы добавил к тому, что уже написано следующее:
diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)
это, конечно, имеет смысл для файлов, где порядок строк не влияет на их содержимое (так что имейте это в виду).
Я использую WinMerge http://winmerge.org для сравнения файлов, при условии , что мне нужно перенести их на свою машину, но это работает для.
level
! =)