Làm thế nào tôi có thể khác hai tập tin cấu hình?


15

Tôi đã có hai tệp snmpd.conf, một trên máy chủ hoạt động và một tệp không hoạt động. Làm cách nào tôi có thể tìm khác biệt hai tệp cấu hình trong khi tước bỏ các nhận xét và dòng mới không liên quan?


1
Xem ra jldugger! Bạn sắp sửa level! =)
Xerxes

Nó thực sự là một ý tưởng tồi để tước bình luận, làm thế nào để bạn biết chúng không liên quan mà không nhìn vào chúng?
AnonymousLurker

Câu trả lời:


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

Để tránh các dòng trống và các dòng không chứa gì ngoài các khoảng trắng, ngoài các dòng giống hệt nhau có một sự khác biệt duy nhất của các khoảng trắng được thêm vào ...

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

Tuy nhiên, đến thời điểm này, có lẽ tôi đã đặt nó vào một kịch bản và viết một cái gì đó giống như gợi ý ban đầu dễ đọc hơn một chút.


+1 để cung cấp giải pháp một dòng
wzzrd

Bất kỳ ý tưởng về làm thế nào để bỏ qua các dòng có chứa khoảng trắng là tốt? Hóa ra một khi bạn cắt bỏ các bình luận, có rất nhiều dòng trống cách chúng ra.
jldugger

@jldugger, hãy thử cập nhật grep để được như thế này để loại trừ nhận xét và khoảng trắng. - egrep -v '^ (#. * |) $'
Zoredache

19

Nếu bạn cảm thấy thoải mái với vim , tôi rất khuyến khích bạn sử dụng vimdiff :

vimdiff file1 file2

Điều này sẽ mở một phiên vim với hai bảng, với một tệp ở mỗi bên. Điểm nổi bật và màu sắc sẽ chỉ ra sự khác biệt giữa các tệp và tất cả các phần giống hệt nhau sẽ bị ẩn (gấp lại, nhưng có thể mở rộng).

Sau đó, nếu bạn muốn chọn lọc hợp nhất các khác biệt từ tệp này sang tệp khác, bạn có thể sử dụng các lệnh sau:

(Coi "tệp hiện tại" là tệp có con trỏ)

^ W ^ W để thay đổi tiêu điểm từ cửa sổ của tệp này sang cửa sổ của tệp khác

] c để tiến tới khối tiếp theo với sự khác biệt

[c để đảo ngược tìm kiếm cho khối trước đó với sự khác biệt

do ( d iff o btain) để mang các thay đổi từ tệp khác sang tệp hiện tại

dp ( d iff p ut) để gửi các thay đổi từ tệp hiện tại sang tệp khác

Lưu ý: Cả dodp đều hoạt động nếu bạn ở trên một khối hoặc chỉ một dòng dưới một khối.

u để u nBạn

zo để mở / bỏ ẩn văn bản

zc để gấp lại / ẩn văn bản

zr sẽ mở ra cả hai tập tin hoàn toàn (sử dụng : giúp gấp để biết thêm về cách gấp)

: diffupdate sẽ quét lại các tệp để thay đổi

Khi bạn bắt đầu di chuyển văn bản đã thay đổi hoặc đưa các thay đổi vào, các phần giống hệt của các tệp cũng sẽ tự động gập lại.

Khi bạn kết thúc, bạn có thể thoát và viết cả hai tệp với : xa!

Bạn cũng có thể viết, thoát, loại bỏ các thay đổi, v.v., một khung tại một thời điểm giống như bạn thường làm với vim.

Bạn có thể sử dụng tất cả các lệnh vim phổ biến để chỉnh sửa các tệp theo ý muốn; Tôi chỉ mô tả các lệnh phổ biến và hữu ích nhất mà bạn có thể sử dụng trong phiên vimdiff (trái ngược với lệnh vim chung).


6

Beyond So sánh là công cụ cuối cùng cho việc này!

Liên kết: http://www.scootersoftware.com/

Có sẵn cho Windows và Linux.

Jeff đã viết một bài viết tổng quan tốt về công cụ một lúc sau: http :
//www.codinghorror.com/blog/archives/000454.html


Ngoài so sánh là tuyệt vời!
Clinton Blackmore

cái này có sẵn trên các hệ thống * nix không?
Preet Sangha

Beyond So sánh 3 không chạy như một ứng dụng giao diện điều khiển trên Linux. Nó đòi hỏi X-Windows. Các bản phân phối Linux được hỗ trợ (32 bit) Red Hat Enterprise Linux 4, 5 Fedora 4 - 10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3, 11 Ubuntu 6.06 - 8.10 Không được kiểm tra Bất kỳ nhân Linux 64 bit nào không tương thích Red Hat Enterprise Linux 3
Đánh dấu Norgren

Tôi không thể sống mà không có công cụ này nữa! Một tiết kiệm thời gian cực đoan. Khi tôi đổi từ PC sang Mac khoảng 1 năm trước, tôi đã rất vui khi thấy rằng nó cũng vừa được chuyển sang Mac.
Jpsy

5

Mở rộng trên một lớp lót của nima, bạn có thể làm điều đó như một hàm shell và thả nó vào .bashrc của bạn

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

trở thành (sử dụng -u vì tôi thích khác biệt thống nhất)

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

Nếu bạn thích người xem khác biệt GUI, meld là tốt và hiểu các tập tin / tập tin được kiểm soát sửa đổi.


+1 cho meld, điều này đã làm cho đồ họa trở nên dễ dàng hơn nhiều.
Avery Payne

4

Sau khi làm sạch các bình luận, tôi sẽ khuyên bạn nên sử dụng KDiff3, đây là một công cụ diff / merge khá tốt và bạn không cần vim fu để sử dụng nó :)


3

Có thể có một cách thanh lịch hơn để làm điều đó, nhưng thực tế (và nhanh chóng):

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

Nếu bạn đang sử dụng shell giống như bash, bạn có thể thử điều này:

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

diff $STRIPPED

Sau đó gọi nó như thế này:

 diff-stripped file1 file2 ...

Bạn cũng có thể thay đổi diffđể vimdiffhay gvimdiffmà cả hai đến với vim.


2

Mở rộng giải pháp của Xerxes, bạn có thể sử dụng các công cụ tinh vi hơn diffđể hiển thị sự khác biệt.

wdiff

wdiffđôi khi có thể "quá thông minh", nhưng tôi thấy nó thường hữu ích khi xem nhanh sự khác biệt giữa các tệp cấu hình. Kịch bản này có thể được sử dụng cho đầu ra với màu sắc:

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

Trên Ubuntu và các hệ thống dựa trên Debian khác, ngay apt-get install wdifftrước khi sử dụng tập lệnh này.

Meld

Meld là một thay thế GUI đẹp, nhưng tính năng "Lọc văn bản" của nó có một số vấn đề. Thay vì sử dụng tính năng lọc văn bản, tôi xóa bình luận hoàn toàn trước khi hiển thị kết quả trong Meld. Hạn chế là mất khả năng chỉnh sửa các tệp trong khi so sánh chúng. Đây là một tập lệnh đơn giản để sử dụng Meld:

#!/bin/bash

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

2

Đôi khi, một số dòng phổ biến bổ sung có thể được loại bỏ bằng cách sắp xếp các tệp trước diff, vì vậy tôi sẽ thêm vào những gì đã được viết như sau:

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

điều này tất nhiên có ý nghĩa đối với các tệp mà thứ tự dòng không ảnh hưởng đến nội dung của nó (vì vậy hãy lưu ý).


1

Điều này giống như một lớp lót của nima, nhưng sẽ lọc ra các dòng trống theo yêu cầu của ai đó.

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

(Tôi cũng sẽ cài đặt colordiff nếu có thể và sử dụng nó thay cho diff khác thường)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.