Để so sánh hai phiên bản của một file văn bản, bạn chỉ cần sử dụng lệnh diff. Theo dõi bài viết dưới đây để biết cách sử dụng lệnh diff để so sánh hai file văn bản trên Terminal của Linux.
So sánh sự khác biệt giữa hai file văn bản trên Terminal của Linux
1. Sử dụng lệnh diff
Lệnh diff là công cụ so sánh hai file và tạo danh sách các thay đổi giữa chúng. Nó không chỉ liệt kê sự khác biệt mà còn tạo ra đầu ra có thể được sử dụng cho các thay đổi.
Lệnh diff được thiết kế để phát hiện sự khác biệt giữa các file mã nguồn và tạo ra đầu ra có thể được đọc và thực thi. Đây là một công cụ hữu ích khi bạn cần biết những thay đổi cụ thể giữa hai file văn bản.
Hãy xem bài viết dưới đây để hiểu cách sử dụng lệnh diff để so sánh hai file văn bản trên Terminal của Linux.
Đầu tiên, hãy kiểm tra nội dung của file thứ 2. Trên dòng lệnh, thứ tự của file xác định file diff đầu tiên và file thứ hai.
Trong ví dụ này, alpha1 là file đầu tiên, và alpha2 là file thứ hai. Cả hai chứa bảng chữ cái ngữ âm, nhưng alpha2 có một số chỉnh sửa để tạo sự khác biệt với alpha1.
Để so sánh hai file văn bản này, sử dụng lệnh diff. Gõ diff + khoảng cách + tên file đầu tiên + khoảng cách + tên file thứ hai, sau đó nhấn Enter:
diff alpha1 alpha2
Sau đó, chúng ta mở xem kết quả. Các sự khác biệt giữa hai file sẽ được liệt kê theo từng cột và được đánh dấu với nhãn cụ thể.
Nhãn chứa số và chữ cái, ví dụ như 4c4. Số đầu tiên là dòng trong alpha1, số thứ hai là dòng trong alpha2. Các chữ cái giữa có ý nghĩa như sau:
c: dòng cần thay đổi trong file đầu tiên để khớp với file thứ 2.
d: dòng cần xóa trong file đầu tiên để khớp với file thứ 2.
Trong ví dụ này, 4c4 biểu thị sự khác biệt ở dòng thứ 4 giữa file alpha1 và alpha2. Đây là sự khác biệt đầu tiên mà lệnh diff phát hiện.
Các dòng bắt đầu bằng < refer='' to='' the='' first=''> (tham chiếu đến file đầu tiên) là alpha1 và > refer to the second file là alpha2. Dòng < delta=''> cho biết Delta là nội dung của dòng thứ 4 trong alpha1, và dòng >Dave cho biết Dave là nội dung của dòng thứ 4 trong alpha2.
Thay đổi tiếp theo là 12c12. Theo logic tương tự, 12c12 nghĩa là cần thay đổi dòng 12 trong alpha1 để khớp với dòng 12 trong alpha2.
Thay đổi thứ 3 đề cập đến việc xóa một dòng từ alpha2. Nhãn 21d20 giải thích rằng 'dòng 21 trong file đầu tiên phải được xóa để đồng bộ từ dòng 20 trở đi'. Dòng < uniform=''> hiển thị nội dung của dòng cần xóa trong alpha1.
Sự khác biệt thứ 4 được đánh dấu là 26a26,28. Điều này chỉ ra rằng có 3 dòng được thêm vào alpha2 từ dòng 26 đến 28. Lưu ý số 26,28 trong nhãn, chúng thể hiện phạm vi số dòng.
Trong ví dụ này, phạm vi bắt đầu từ dòng 26 đến dòng 28. Nhãn nghĩa là 'dòng 26 trong file đầu tiên, thêm dòng 26 đến 28 trong file thứ 2'. Các từ Quirk, Strange và Charm là những từ xuất hiện trong 3 dòng này cần thêm vào alpha1.
2. Kiểm tra sự giống nhau giữa 2 file text
Nếu bạn chỉ muốn biết liệu 2 file text có giống nhau hay không, bạn có thể sử dụng tùy chọn -s (báo cáo các file giống hệt nhau).
diff -s alpha1 alpha3
Bạn cũng có thể sử dụng tùy chọn -q (tóm tắt) để nhận mô tả ngắn gọn về sự khác biệt giữa 2 file.
diff -q alpha1 alpha2
Lưu ý rằng nếu 2 file giống hệt nhau, tùy chọn -q (tóm tắt) sẽ không trả về báo cáo nào.
3. So sánh 2 file text để kiểm tra sự khác biệt
Tùy chọn -y sử dụng các cột cạnh nhau để mô tả sự khác biệt giữa 2 file. Sử dụng tùy chọn -W để giới hạn số lượng cột được hiển thị và làm cho kết quả dễ đọc hơn.
Ví dụ, sử dụng lệnh diff sau để hiển thị kết quả so sánh với định dạng hai bên và giới hạn trong 70 cột:
diff -y -W 70 alpha1 alpha2
File đầu tiên trên dòng lệnh, alpha1, hiển thị bên trái và file thứ 2, alpha2, hiển thị ở bên phải. Các dòng của từng file được hiển thị cùng một cách. Các ký tự chỉ báo kèm với các dòng trong alpha2 để biểu thị sự thay đổi, xóa hoặc thêm nội dung.
|: một dòng đã bị thay đổi trong file thứ 2.
<> một dòng đã bị xóa khỏi file thứ 2.
>: một dòng được thêm vào file thứ 2 mà không có trong file đầu tiên.
Nếu muốn tóm tắt các thay đổi, sự khác biệt giữa 2 file, chúng ta có thể sử dụng tùy chọn --suppress-common-lines. Tùy chọn này buộc lệnh diff chỉ liệt kê các dòng đã thay đổi, thêm hoặc xóa nội dung.
colordiff -y -W 70 --suppress-common-lines alpha1 alpha2
4. Thêm màu sắc cho lệnh
Tiện ích mang tên colordiff, được sử dụng để thêm màu sắc cho đầu ra của lệnh diff, giúp dễ dàng nhận biết các dòng có sự khác biệt.
Nếu bạn đang sử dụng Ubuntu hoặc các bản phân phối dựa trên Debian, hãy sử dụng apt-get để cài đặt colordiff trên hệ thống. Trên các bản phân phối Linux khác, bạn có thể sử dụng chương trình quản lý gói thư viện để cài đặt tiện ích này.
sudo apt-get install colordiff
Sử dụng colordiff tương tự như cách chúng ta sử dụng diff.
Thực tế, colordiff là một trình bao bọc cho diff, và diff thực hiện tất cả các công việc phía sau hậu trường. Vì vậy, tất cả các tùy chọn diff đều hoạt động với colordiff.
5. Thêm một số ngữ cảnh
Để tìm sự thay đổi giữa 2 file, thay vì hiển thị tất cả, bạn có thể yêu cầu diff cung cấp một số ngữ cảnh.
Để làm điều này, chúng ta có 2 tùy chọn để hiển thị một số dòng trước và sau mỗi dòng có thay đổi, giúp bạn dễ dàng tìm ra sự khác biệt giữa 2 file.
Cách đầu tiên là sử dụng tùy chọn -c (sao chép ngữ cảnh):
colordiff -c alpha1 alpha2
Kết quả diff này bao gồm một tiêu đề, liệt kê tên của 2 file và số lần chỉnh sửa. Dấu hoa thị (*) trước tên của file đầu tiên và dấu gạch ngang (-) trước tên của file thứ 2 được sử dụng để chỉ ra nguồn và đích của so sánh.
Dòng với dấu hoa thị và số 1,7 giữa chỉ ra sự thay đổi từ dòng 1 đến 7 trong file đầu tiên (alpha1). Chữ Delta được đánh dấu là thay đổi và có dấu chấm than (!) bên cạnh, được đánh màu đỏ. Ba dòng văn bản không thay đổi được hiển thị trước và sau dòng thay đổi để cung cấp ngữ cảnh.
Dòng có dấu gạch ngang và số 1,7 giữa chỉ ra các dòng từ 1 đến 7 trong file alpha2. Chữ Dave trên dòng thứ 4 được đánh dấu là thay đổi.
3 dòng ngữ cảnh trên và dưới mỗi thay đổi là giá trị mặc định. Nếu muốn, bạn có thể chỉ định số dòng này bằng cách sử dụng tùy chọn -C (sao chép ngữ cảnh) và thêm số dòng:
colordiff -C 2 alpha1 alpha2
Tùy chọn thứ 2 để cung cấp ngữ cảnh là -u (ngữ cảnh thống nhất):
colordiff -u alpha1 alpha2
Như đã đề cập trước đó, đầu ra chứa tiêu đề, hiển thị tên 2 file và số lần chỉnh sửa của các file. Có dấu gạch ngang (-) trước tên alpha1 và dấu cộng (+) trước tên alpha2, để biểu thị rõ ràng file tương ứng.
Dấu hiệu (@) bắt đầu các dòng, đánh dấu sự khác biệt giữa 2 file. 3 dòng trước và sau mỗi thay đổi cung cấp ngữ cảnh, cho biết dòng thay đổi đó nằm ở đâu trong file.
Dòng từ alpha1 bắt đầu bằng dấu gạch ngang (-), còn dòng từ alpha2 bắt đầu bằng dấu cộng (+). Sử dụng tùy chọn này, chúng ta chỉ cần 8 dòng để liệt kê sự khác biệt, so với 15 dòng khi không sử dụng tùy chọn này.
Chúng ta có thể yêu cầu diff cung cấp số lượng dòng bối cảnh chính xác mà chúng ta muốn xem. Để thực hiện điều này, hãy sử dụng tùy chọn -U (bối cảnh thống nhất) với giá trị U U và chỉ định số lượng dòng bạn muốn xem:
Nếu muốn, bạn có thể sử dụng tùy chọn -U (chữ U viết hoa) để chỉ định số dòng ngữ cảnh mong muốn.
colordiff -U 2 alpha1 alpha2
6. Bỏ qua khoảng trắng, chữ viết hoa viết thường
Thử so sánh 2 file test4 và test5. Cả hai file này đều chứa tên của 6 siêu anh hùng.
colordiff -y -W 70 test4 test5
Kết quả hiển thị không có sự khác biệt nào ở các dòng Black Widow, Spider-Man và Thor. Các thay đổi chỉ được đánh dấu ở các dòng Captain America, Ironman và The Hulk.
Trong test5, Hulk được viết bằng chữ thường 'h' và Captain America có thêm khoảng trống giữa 'Captain' và 'America'. Sự khác biệt ở dòng Ironman ở đây chủ yếu là về khoảng trắng.
Để bỏ qua sự khác biệt cụ thể giữa 2 file, chúng ta có thể sử dụng:
-i: Bỏ qua sự khác biệt giữa chữ viết hoa và viết thường.
-Z: Bỏ qua dấu cách, khoảng trắng.
-b: Bỏ qua các thay đổi về số lượng khoảng trắng.
-w: Bỏ qua các thay đổi về khoảng trắng.
Tiếp theo yêu cầu, diff sẽ kiểm tra lại 2 file này, nhưng bỏ qua sự khác biệt giữa chữ in hoa và chữ thường:
colordiff -i -y -W 70 test4 test5
Các dòng 'The Hulk' và 'the hulk' được xem là giống nhau và không được đánh dấu chữ thường 'h'. Tiếp theo, sử dụng lệnh dưới đây để bỏ qua khoảng trắng:
colordiff -i -Z -y -W 70 test4 test5
Sử dụng lệnh sau để yêu cầu diff bỏ qua sự khác biệt giữa chữ in hoa và chữ thường cũng như tất cả các khoảng trắng:
colordiff -i -w -y -W 70 test4 test5
Nói với diff bỏ qua những thay đổi mà chúng ta không cần phải quan tâm để khớp các file với nhau.
Ngoài ra, lệnh diff còn nhiều tùy chọn khác, tuy nhiên, phần lớn các tùy chọn này liên quan đến việc tạo đầu ra có thể đọc được bởi máy.
Hướng dẫn trên đây của Mytour giới thiệu cách so sánh hai file văn bản trên Terminal Linux. Nếu có câu hỏi hoặc thắc mắc, đừng ngần ngại để lại ý kiến trong phần bình luận dưới bài viết.
Bạn cũng có thể khám phá cách tạo file văn bản qua Terminal trên Linux với hướng dẫn chi tiết từ Mytour, tạo file văn bản qua Terminal trên Linux - một quy trình khá đơn giản để bạn thực hiện ngay.