Cách so sánh hai file văn bản trên Linux Terminal

Nếu muốn xem sự khác nhau giữa hai file văn bản, hãy sử dụng lệnh diff. Hướng dẫn này sẽ chỉ cho bạn cách sử dụng lệnh diff trên Linux và macOS.

Lệnh diff so sánh hai file văn bản và tạo một danh sách các điểm khác biệt giữa hai file này. Để chính xác hơn, nó tạo một danh sách các thay đổi trong file thứ nhất để khớp với file thứ hai. Biết được điều này bạn sẽ hiểu đầu ra lệnh diff dễ dàng hơn. Lệnh diff được thiết kế để tìm điểm khác nhau giữa các file code nguồn và tạo đầu ra có thể đọc và hoạt động trên các chương trình khác như lệnh patch.

Nào hãy bắt đầu phân tích hai file. Thứ tự các file trên dòng lệnh xác định file lệnh diff coi là file đầu tiên và file thứ hai. Trong ví dụ bên dưới, alpha1 là file đầu tiên và alpha2 là file thứ hai. Cả hai file đều chứa bảng chữ cái ngữ âm nhưng file thứ hai, alpha 2 đã thực hiện một số chỉnh sửa để hai file không giống nhau.

Chúng ta có thể so sánh các file sử dụng lệnh sau. Gõ diff, dấu cách, tên file thứ nhất, dấu cách, tên file thứ hai và nhấn Enter.

diff alpha1 alpha2

Chạy lệnh diff để tìm sự khác biệt giữa hai file

Đọc đầu ra như thế nào? Mỗi khác biệt giữa hai file được liệt kê theo thứ tự trong một cột và được dán nhãn. Nhãn này chứa các số ở hai bên và chữ cái ở giữa, ví dụ 4c4. Con số đầu tiên là số dòng trong alpha1 và con số thứ hai là số dòng trong alpha2. Chữ cái ở giữa có nghĩa như sau:

  • c: Dòng trong file đầu tiên cần được thay đổi để khớp với dòng trong file thứ hai.

  • d: Dòng trong file đầu tiên cần xóa để khớp với file thứ hai.

  • a: Nội dung bổ sung cần được thêm vào file thứ nhất để trùng khớp với file thứ hai.

Ví dụ, 4c4 có nghĩa là dòng thứ tư trong file alpha1 phải được thay đổi để giống với dòng thứ 4 file alpha2. Đây là sự khác biệt đầu tiên giữa hai file mà diff tìm thấy.

Các dòng bắt đầu bằng < tham chiếu đến file đầu tiên và các dòng bắt đầu với > tham chiếu đến file thứ hai. Dòng < Delta cho biết từ Delta là nội dung dòng thứ tư trong file alpha1. Dòng > Dave cho biết từ Dave là nội dung dòng thứ 4 trên file alpha2. Tóm lại, bạn cần thay từ Detal bằng từ Dave trên dòng thứ 4 trong file alpha1 để hai file giống nhau.

Thay đổi tiếp theo là 12c12, tương tự như vậy, chúng ta có thể thấy dòng 12 của file alpha1 chứa từ Lima nhưng dòng 12 trong alpha2 lại chứa từ Linux.

Thay đổi thứ ba cho ta biết có một dòng đã bị xóa ở file alpha2. Nhãn 21d20 xác định cần xóa dòng 21 ở file đầu tiên để hai hai file giống nhau. Dòng < Uniform cho biết nội dung dòng cần xóa từ alpha1.

Sự khác biệt thứ tư là 26a26,28. Nhãn này cho biết trong file alpha2 có thêm ba dòng khác với file alpha1. Số dòng 26, 28 được phân tách bằng dấu phẩy để thể hiện phạm vi dòng. Trong ví dụ này, phạm vi từ dòng 26 đến dòng 28. Bạn có thể hiểu nhãn này cần thêm ba dòng trong alpha2 vào alpha1 để hai file giống nhau. Các dòng cần thêm vào chứa các từ Quirk, Strange và Charm.

Nếu chỉ muốn biết hai file văn bản có giống nhau hay không, hãy sử dụng tùy chọn -s.

diff -s alpha1 alpha3

Nhận định hai file có giống nhau không

Bạn có thể sử dụng tùy chọn -q để xem hai file có khác không.

diff -s alpha1 alpha3

Nhận định hai file có khác không

Và nếu có nhận được kết quả khác nhau, tùy chọn này cũng không nêu rõ sự khác biệt giữa hai file.

Tùy chọn -y sử dụng bố cục khác để hiển thị các điểm khác nhau giữa hai file. Khi sử dụng tùy chọn này, bạn có thể sử dụng thêm tùy chọn -w để giới hạn số cột hiển thị cho kết quả dễ đọc. Dưới đây là lệnh diff tạo kết quả hiển thị hai bên và giới hạn trong 70 cột.

diff -y -W 70 alpha1 alpha2

Sử dụng tùy chọn -y

File đầu tiên trên dòng lệnh được hiển thị bên trái và file thứ hai được hiển thị bên phải. Các dòng trong từng file được hiển thị cạnh nhau. Có các ký tự chỉ báo cùng với các dòng này trong alpha2 biểu thị thay đổi, xóa hoặc thêm nội dung.

  • |: Dòng thay đổi ở trong file thứ hai.

  • <: Dòng bị xóa trong file thứ hai.

  • >: Dòng thêm vào trong file thứ hai và file thứ nhất không có.

Nếu thích tóm tắt ngắn gọn những thay đổi này, sử dụng tùy chọn suppress-common-lines để lệnh diff chỉ hiển thị sự thay đổi, thêm hoặc xóa.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Sử dụng tùy chọn suppress-common-lines

Thêm màu sắc cho lệnh

Một tiện ích khác được gọi là colordiff thêm màu sắc để làm nổi bật kết quả đầu ra lệnh diff giúp người xem dễ nhìn sự khác biệt.

Để cài đặt tiện ích này, sử dụng lệnh apt-get nếu sử dụng Ubuntu hoặc bản phân phối dựa trên Debian khác. Trên các bản phân phối Linux khác sử dụng công cụ quản lý gói của distro đó.

sudo apt-get install colordiff

Sử dụng colordiff như diff.

Sử dụng colordifff

Thực tế, colordiff là một wrapper (trình bao bọc) cho diff, do đó, bạn vẫn có thể sử dụng các tùy chọn diff với colordiff.

Sử dụng các tùy chọn của diff cho colordiff

Cung cấp một số bối cảnh để dễ dàng tìm điểm khác biệt

Để tìm một số thay đổi giữa hai file văn bản, thay vì liệt kê hết, bạn có thể yêu cầu diff cung cấp một số bối cảnh cụ thể. Có hai cách để thực hiện điều này và cho ra cùng một kết quả, hiển thị một số dòng trước và sau mỗi dòng thay đổi.

Cách đầu tiên là sử dụng tùy chọn -c.

colordiff -c alpha1 alpha2

Sử dụng tùy chọn -c

Đầu ra diff này có một tiêu đề, tiêu đề liệt kê tên hai file và số lần chỉnh sửa của nó. Có dấu hoa thị (*) trước file thứ nhất và dấu gạch ngang (-) trước file thứ hai. Dấu hoa thị và dấu gạch ngang sẽ được sử dụng để chỉ đầu ra của file đó.

Dòng có dấu hoa thị và 1,7 ở giữa cho biết những thay đổi của file alpha1 từ dòng một đến bảy. Chữ Delta được đánh dấu đã thay đổi. Nó có một dấu chấm than (!) cạnh đó và có màu đỏ. Bạn có thể thấy trước và sau chữ đó có ba dòng văn bản không thay đổi, cho biết ngữ cảnh của dòng đó trong file.

Dòng có dấu gạch ngang với 1,7 ở giữa cho biết những thay đổi trong file alpha2. Tương tự như trên, chúng ta thấy từ Dave ở dòng 4 được đánh dấu thay đổi.

Ba dòng văn bản không đổi trước và sau mỗi thay đổi là giá trị mặc định. Bạn có thể chỉ định số dòng này nếu muốn. Để thực hiện điều đó, sử dụng tùy chọn -c với chữ C viết hoa và số dòng muốn hiển thị.

colordiff -C 2 alpha1 alpha2

Chỉ định số dòng bối cảnh

Tùy chọn thứ hai là sử dụng tùy chọn -u.

colordiff -u alpha1 alpha2

Sử dụng tùy chọn -u

Giống với tùy chọn trước, bạn cũng có một tiêu đề trên đầu ra, gồm tên file và số lần thay đổi. Dấu gạch ngang (-) được đặt trước tên của alpha1 và dấu cộng (+) trước tên alpha2. Điều này cho chúng ta biết dấu gạch ngang được sử dụng để chỉ alpha1 và dấu cộng dùng cho alpha2. Bạn có thể thấy trên hình trên có các dấu @ xuất hiện rải rác trong danh sách, nó đánh dấu sự bắt đầu của những thay đổi và dòng nào của mỗi file.

Bạn có thể thấy ba dòng trước và sau dòng được đánh dấu khác nhau, cho biết bối cảnh dòng thay đổi. Dòng từ file alpha1 được bắt đầu bằng dấu gạch ngang, dòng từ file alpha2 bắt đầu bằng dấu cộng. Với tùy chọn này, bạn chỉ mất có 8 dòng để liệt kê sự khác biệt trong khi tùy chọn trên cần đến 15 dòng.

Tương tự như tùy chọn trên, bạn có thể sử dụng tùy chọn -u với chữ U viết hoa để cung cấp số dòng bối cảnh mong muốn.

colordiff -U 2 alpha1 alpha2

Sử dụng tùy chọn -u với chữ U viết hoa

Bỏ khoảng trắng và chữ viết hoa, viết thường

Hãy thử so sánh với hai file khác, test4 và test5 có tên 6 siêu anh hùng.

colordiff -y -W 70 test4 test5

Sử dụng hai file khác

Kết quả cho thấy diff không tìm thấy sự khác biệt nào ở các dòng Black Widow, Spider-Man và Thor. Nó đánh dấu những thay đổi ở dòng Captain America, Ironman và The Hulk.

Vậy ở những dòng này có điểm gì khác nhau? Trong test5 Hulk được viết bằng chữ thường, h, và Captain America có thêm một khoảng trống giữa Captain và America. Vậy ở dòng Ironman, có gì khác biệt ở đây? Bạn không thể nhìn thấy bằng mắt thường sự khác biệt ở dòng này trên hai file. Ở đây chúng có khoảng trắng.

Bạn có thể bỏ qua sự khác biệt cụ thể giữa hai file như:

  • -i : Bỏ qua sự khác biệt trong viết hoa và viết thường.

  • -Z : Bỏ qua khoảng trắng.

  • -b : Bỏ qua những thay đổi về số lượng khoảng trắng.

  • -w : Bỏ qua mọi thay đổi khoảng trắng.

Hãy yêu cầu diff kiểm tra lại hai fille đó, nhưng lần này hãy bỏ qua mọi khác biệt trong viết hoa và viết thường.

colordiff -i -y -W 70 test4 test5

Bỏ qua mọi khác biệt trong viết hoa và viết thường

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 hãy thử bỏ qua khoảng trắng bằng lệnh sau:

colordiff -i -Z -y -W 70 test4 test5

Bỏ qua khoảng trắng

Bạn có thể thấy diff không đánh dấu dòng Ironman khác biệt nữa, chỉ đánh dấu dòng Captain America. Bây giờ thử yêu cầu diff bỏ qua sự khác biệt trong viết hoa và viết thường và bỏ qua tất cả các vấn đề về khoảng trắng.

colordiff -i -w -y -W 70 test4 test5

Bỏ qua sự khác biệt trong viết hoa và viết thường và bỏ qua tất cả các vấn đề về khoảng trắng

Bạn có thể thấy hai file giờ đây không có sự khác biệt.

Lệnh diff có nhiều tùy chọn nhưng chủ yếu liên quan đến việc tạo đầu ra để máy có thể đọc được. Những tùy chọn trong các ví dụ trên sẽ giúp bạn theo dõi sự khác biệt giữa hai file dễ dàng hơn.

Chúc các bạn thực hiện thành công!

Thứ Ba, 16/04/2019 16:08
54 👨 3.885
0 Bình luận
Sắp xếp theo
    ❖ Linux