Cách so sánh ba tệp trong Linux bằng công cụ diff3

theanh

Administrator
Nhân viên
Trong một trong những hướng dẫn trước đây của chúng tôi, chúng tôi đã thảo luận về một tiện ích dòng lệnh Linux - được gọi là diff - cho phép bạn so sánh hai tệp theo từng dòng. Nhưng nếu yêu cầu là so sánh không phải hai, mà là ba tệp thì sao? Vâng, cũng có một tiện ích dòng lệnh Linux cho mục đích này và nó được gọi một cách thích hợp là diff3.

Nếu bạn đang tìm kiếm một công cụ như vậy, thì không cần tìm đâu xa nữa. Trong hướng dẫn này, chúng tôi sẽ giải thích cách sử dụng diff3 thông qua các ví dụ dễ hiểu.

Cài đặt diff3​

Công cụ diff3 có thể sẽ được cài đặt theo mặc định trên hệ thống của bạn - ít nhất là trên Ubuntu. Nhưng nếu không phải vậy, thì đừng lo lắng vì bạn có thể dễ dàng thực hiện bằng cách cài đặt gói GNU Diffutils. Để biết hướng dẫn về cách tải xuống và cài đặt gói trên hệ thống của bạn, hãy truy cập tại đây.

Sử dụng Diff3​

Vì tiện ích diff3 so sánh ba tệp, nên đối với các ví dụ sử dụng của chúng tôi, chúng tôi sẽ phải lấy ba tệp mà chúng tôi sẽ truyền làm đầu vào cho công cụ.

Đây là tệp1:
Mã:
This is line1 with some change
This is line2
This is line3
Đây là file2:
Mã:
This is line1
This is line2
This is line3
Và đâylà file3:
Mã:
This is line1
This is line2
This is line3
Rõ ràng, nếu chúng ta xem nội dung của ba tệp này, thì sự thay đổi duy nhất nằm ở dòng đầu tiên của tệp đầu tiên. Bây giờ chúng ta hãy xem diff3 báo cáo thay đổi này như thế nào.

Sau đây là cách chúng ta có thể sử dụng diff3 trong trường hợp này:
Mã:
diff3 file1 file2 file3
Và đây là kết quả đầu ra mà nó tạo ra:
Mã:
====1
1:1c
 This is line1 with some change
2:1c
3:1c
 This is line1
Bạn có thể hiểu kết quả đầu ra theo cách sau:
  • Dòng đầu tiên bắt đầu bằng bốn dấu '=' và kết thúc bằng số '1' cho biết sự thay đổi nằm ở tệp đầu tiên.
  • Ở dòng tiếp theo, '1' đầu tiên có nghĩa là tệp1; '1c' sau dấu hai chấm 'có nghĩa là dòng đầu tiên chứa'. Dòng thực tế được hiển thị ở dòng tiếp theo của đầu ra.
  • Tương tự, 2:1c và 3:1c có nghĩa là 'dòng đầu tiên của tệp2 và tệp3 chứa'. Và vì nội dung của dòng giống nhau trong cả hai tệp, nên dòng thực tế chỉ được hiển thị một lần, ở cuối đầu ra.
Để làm rõ hơn, chúng ta hãy lấy một trường hợp khác trong đó sự thay đổi nằm ở tệp 3.

Đây là tệp 1:
Mã:
This is line1
This is line2
This is line3
Đây là file2:
Mã:
This is line1
This is line2
This is line3
Và đâylà file3:
Mã:
This is line1 with some change
This is line2
This is line3
Lệnh vẫn là tương tự:
Mã:
diff3 file1 file2 file3
Và đây là đầu ra:
Mã:
====3
1:1c
2:1c
 This is line1
3:1c
 This is line1 with some change
Vì vậy, đầu ra, trong trường hợp này, có thể được hiểu là:
  • Sự thay đổi nằm ở file3
  • Cả file1 và file2 đều chứa "Đây là dòng1" làm dòng đầu tiên của chúng
  • Trong khi file3 chứa "Đây là dòng1 với một số "thay đổi" là dòng đầu tiên của nó.
Đó là tất cả về cách diff3 báo cáo thay đổi theo từng dòng. Bây giờ chúng ta hãy xem diff3 hoạt động như thế nào nếu một trong các tệp chứa một dòng thừa:

Trong khi file1 và file2 vẫn giữ nguyên, đây là file3:
Mã:
This is line1
This is line2
This is line3
This is line4
Như nội dung của nó, file3 hiện chứa một dòng thừa ở cuối.

Chúng ta hãy chạy cùng một lệnh diff3:
Mã:
diff3 file1 file2 file3
Và đây là đầu ra lệnh tạo ra:
Mã:
====3
1:3a
2:3a
3:4c
 This is line4
Đầu ra bắt đầu bằng cách nói rằng thay đổi nằm trong file3. Thay đổi nằm ở dòng thứ tư của file3 (3:4c), là một dòng hoàn toàn mới khi so sánh với file1 và file2.

Những gì chúng ta đã thảo luận cho đến nay là một số trường hợp đơn giản. Hãy lấy một vài tình huống hơi phức tạp. Ví dụ, hãy coi file1, file2 và file3 chứa sau đây:
Mã:
This is line1
This is line2 with some change
This is line3
Mã:
This is line1
This is line2
This is line3 with some change
Vì vậy, bây giờ cả file1 và file2 đều chứa các thay đổi và chúng cũng nằm trên các dòng khác nhau. Hãy cùng xem diff3 tạo ra kết quả gì trong trường hợp này:
Mã:
====
1:2,3c
 This is line2 with some change
 This is line3
2:2,3c
 This is line2
 This is line3
3:2,3c
 This is line2
 This is line3 with some change
Như bạn có thể thấy trong kết quả đầu ra hiển thị ở trên, dòng đầu tiên không chứa bất kỳ số nào. Đó là vì không phải một mà là nhiều tệp hiện chứa các thay đổi. Đối với diff3, dòng 2 và 3 của cả ba tệp hiện đều khác nhau. Đó là lý do tại sao thay vì một số duy nhất sau dấu hai chấm :)), kết quả đầu ra hiện chứa một phạm vi - '2,3', nghĩa là từ dòng 2 đến dòng 3.

Hãy lấy thêm một ví dụ nữa. Giả sử lần này ba tệp chứa thông tin sau:
Mã:
This is line1
This is line2
This is line3
This is line4
Mã:
This is line1
This is line2
This is line3
This is line4
This is line5
Bây giờ khi lệnh diff được chạy, nó tạo ra kết quả sau:
Mã:
====
1:4c
 This is line4
2:3a
3:4,5c
 This is line4
 This is line5
Ở đây, nếu bạn cố gắng hiểu, lệnh diff3 cho biết rằng các thay đổi nằm sau dòng 3 trong cả ba tệp. Trong khi file1 chứa dòng "This is line4" làm dòng thứ tư, file3 chứa "This is line4" và "This is line5" làm dòng thứ tư và thứ năm. Mặt khác, file2 chỉ có 3 dòng.

Vậy là xong phần cơ bản về diff3. Để biết thêm thông tin, đây là những gì tài liệu chính thức nói về công cụ này: "Bạn có thể sử dụng lệnh diff3 để hiển thị sự khác biệt giữa ba tệp. Khi hai người thực hiện các thay đổi độc lập đối với một bản gốc chung, diff3 có thể báo cáo sự khác biệt giữa bản gốc và hai phiên bản đã thay đổi và có thể tạo ra một tệp được hợp nhất chứa cả hai thay đổi của người dùng cùng với các cảnh báo về xung đột.".

Kết luận​

Chúng ta mới chỉ khám phá sơ qua, Diff3 có khả năng làm được nhiều hơn thế nữa. Ví dụ, như tài liệu chính thức cũng chỉ ra, bạn cũng có thể sử dụng nó để hợp nhất các thay đổi. Thêm vào đó, có nhiều tùy chọn dòng lệnh cho phép bạn tùy chỉnh đầu ra của lệnh cũng như truy cập một số tính năng khác mà nó cung cấp. Tất cả đều có trên trang hướng dẫn, hãy xem qua. Bạn cũng có thể muốn xem hướng dẫn lệnh sdiff của chúng tôi
 
Back
Bên trên