У мене є два файли 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 для зворотного пошуку попереднього блоку з відмінностями
do ( d iff o btain), щоб внести зміни з іншого файлу до поточного файлу
dp ( d iff p ut), щоб надіслати зміни з поточного файлу до іншого файлу
Примітка. І дію , і dp працюють, якщо ви перебуваєте в блоці або лише в одному рядку під блоком.
у к у ндо
zo, щоб розгорнути / приховати текст
zc, щоб повторно скласти / приховати текст
zr повністю розгорнуть обидва файли (використовуйте : допоможіть скласти докладніше про складання)
: diffupdate повторно сканує файли на предмет змін
Коли ви почнете переміщувати змінений текст або вносити зміни, тепер ідентичні частини файлів також автоматично згортаються.
Коли ви закінчите, ви можете закрити і записати обидва файли за допомогою : xa!
Ви також можете записувати, закривати, скасовувати зміни тощо, одночасно, як і в vim.
Ви можете використовувати всі загальні команди vim для редагування файлів за бажанням; Я описав лише найпоширеніші та корисні команди, які ви, ймовірно, використовуєте в сеансі vimdiff (на відміну від загального vim).
Більше порівняння - найкращий інструмент для цього!
Посилання: http://www.scootersoftware.com/
Доступно для Windows та Linux.
Джефф написав хорошу оглядову статтю про цей інструмент ще раз:
http://www.codinghorror.com/blog/archives/000454.html
Розширюючи один-вкладиш 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 є приємним і розуміє редагування, керовані редакцією.
Очистивши коментарі, я б радив використовувати KDiff3, це досить хороший інструмент для розмежування / злиття, і вам не потрібно vim fu, щоб використовувати його :)
Якщо ви використовуєте 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 <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)
це, звичайно, має сенс для файлів, де порядок рядків не впливає на його вміст (тому майте на увазі).
Я використовую http://minmerge.org WinMerge для розходження файлів, якщо мені доведеться перетягувати їх на свою машину, але це працює для.
level
! =)