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?
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?
Câu trả lời:
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.
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ả do và dp đề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).
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
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.
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ó :)
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
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
để vimdiff
hay gvimdiff
mà cả hai đến với vim
.
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
đô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 wdiff
trước khi sử dụng tập lệnh này.
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)
Đô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 ý).
Tôi sử dụng WinMerge http://winmerge.org cho các tệp khác, với điều kiện tôi phải kéo chúng xuống máy của mình, nhưng nó hoạt động được.
level
! =)