Linux uniq command

Khám phá sức mạnh của lệnh uniq trong Linux: Loại bỏ dòng trùng lặp hiệu quả

Trong thế giới Linux đầy mạnh mẽ và linh hoạt, việc quản lý và xử lý dữ liệu trở nên vô cùng quan trọng. Và để làm được điều đó, chúng ta cần đến những công cụ nhỏ bé nhưng vô cùng hữu ích. Hôm nay, chúng ta sẽ cùng nhau khám phá một "viên ngọc quý" như vậy: lệnh uniq. Lệnh này giúp bạn dễ dàng loại bỏ các dòng trùng lặp trong một tập tin hoặc đầu ra của một lệnh khác, giúp bạn tiết kiệm thời gian và công sức trong việc phân tích và xử lý dữ liệu.

Bài viết này sẽ cung cấp cho bạn một cái nhìn tổng quan về lệnh uniq, từ cú pháp cơ bản đến các tùy chọn nâng cao, kèm theo các ví dụ thực tế để bạn có thể áp dụng ngay vào công việc hàng ngày. Chúng ta cũng sẽ so sánh uniq với một số công cụ tương tự khác để bạn có thể lựa chọn công cụ phù hợp nhất cho nhu cầu của mình. Nào, hãy cùng bắt đầu hành trình khám phá lệnh uniq nhé!

uniq là gì và tại sao nó lại quan trọng?

Lệnh uniq là một tiện ích dòng lệnh trong Linux được sử dụng để lọc các dòng trùng lặp liền kề trong một tập tin hoặc đầu ra từ một lệnh khác. Nó hoạt động bằng cách so sánh các dòng liên tiếp và chỉ giữ lại một bản sao của dòng đầu tiên trong chuỗi các dòng trùng lặp. Điều này đặc biệt hữu ích khi bạn làm việc với các tập tin log, dữ liệu thống kê, hoặc bất kỳ loại dữ liệu nào có thể chứa các dòng lặp lại.

Vậy tại sao uniq lại quan trọng? Hãy tưởng tượng bạn đang phân tích một tập tin log lớn để tìm kiếm các lỗi xảy ra thường xuyên nhất. Nếu tập tin log chứa nhiều dòng trùng lặp (ví dụ, một lỗi lặp đi lặp lại nhiều lần), việc đếm số lần xuất hiện của mỗi lỗi sẽ trở nên khó khăn hơn. uniq sẽ giúp bạn loại bỏ các dòng trùng lặp này, giúp bạn tập trung vào các lỗi duy nhất và đưa ra các giải pháp hiệu quả hơn. Hoặc, bạn cần thống kê số lượng người dùng truy cập vào một trang web. Nếu một người dùng truy cập nhiều lần, bạn chỉ muốn đếm họ một lần. uniq sẽ giúp bạn loại bỏ các lần truy cập trùng lặp và có được số liệu chính xác.

Cú pháp cơ bản của lệnh uniq

Cú pháp cơ bản của lệnh uniq khá đơn giản:

uniq [tùy chọn] [tập tin đầu vào] [tập tin đầu ra]
  • tùy chọn: Các tùy chọn để điều chỉnh hành vi của lệnh uniq. Chúng ta sẽ tìm hiểu về các tùy chọn này chi tiết hơn ở phần sau.
  • tập tin đầu vào: Tập tin mà bạn muốn lọc các dòng trùng lặp. Nếu bạn không chỉ định tập tin đầu vào, uniq sẽ đọc dữ liệu từ đầu vào chuẩn (stdin).
  • tập tin đầu ra: Tập tin mà bạn muốn ghi kết quả đã lọc. Nếu bạn không chỉ định tập tin đầu ra, uniq sẽ in kết quả ra đầu ra chuẩn (stdout).

Ví dụ đơn giản nhất, nếu bạn muốn lọc các dòng trùng lặp trong tập tin input.txt và in kết quả ra màn hình, bạn có thể sử dụng lệnh sau:

uniq input.txt

Để ghi kết quả vào một tập tin mới, ví dụ output.txt, bạn có thể sử dụng lệnh sau:

uniq input.txt output.txt

Các tùy chọn thường dùng của lệnh uniq

Lệnh uniq cung cấp một số tùy chọn hữu ích để bạn có thể tùy chỉnh hành vi của nó. Dưới đây là một số tùy chọn thường dùng nhất:

  • -c hoặc --count: Hiển thị số lần mỗi dòng xuất hiện.
  • -d hoặc --repeated: Chỉ in ra các dòng trùng lặp.
  • -u hoặc --unique: Chỉ in ra các dòng không trùng lặp.
  • -i hoặc --ignore-case: Bỏ qua sự khác biệt về chữ hoa chữ thường khi so sánh các dòng.
  • -f N hoặc --skip-fields=N: Bỏ qua N trường đầu tiên của mỗi dòng khi so sánh. Trường được phân tách bởi khoảng trắng.
  • -s N hoặc --skip-chars=N: Bỏ qua N ký tự đầu tiên của mỗi dòng khi so sánh.
  • -w N hoặc --check-chars=N: Chỉ so sánh N ký tự đầu tiên của mỗi dòng.

Hãy cùng xem một vài ví dụ cụ thể để hiểu rõ hơn về cách sử dụng các tùy chọn này.

Ví dụ 1: Đếm số lần xuất hiện của mỗi dòng

Giả sử bạn có một tập tin names.txt chứa danh sách tên, với một số tên bị lặp lại:

Alice
Bob
Charlie
Alice
Bob
Alice

Để đếm số lần xuất hiện của mỗi tên, bạn có thể sử dụng lệnh sau:

uniq -c names.txt

Kết quả sẽ là:

      3 Alice
      2 Bob
      1 Charlie

Ví dụ 2: Chỉ in ra các dòng trùng lặp

Sử dụng lại tập tin names.txt, để chỉ in ra các tên bị lặp lại, bạn có thể sử dụng lệnh sau:

uniq -d names.txt

Kết quả sẽ là:

Alice
Bob

Ví dụ 3: Chỉ in ra các dòng không trùng lặp

Vẫn sử dụng tập tin names.txt, để chỉ in ra các tên không bị lặp lại, bạn có thể sử dụng lệnh sau:

uniq -u names.txt

Kết quả sẽ là:

Charlie

Ví dụ 4: Bỏ qua sự khác biệt về chữ hoa chữ thường

Giả sử bạn có một tập tin words.txt chứa các từ, với một số từ được viết hoa khác nhau:

apple
Apple
banana
Banana

Để coi "apple" và "Apple" là giống nhau, bạn có thể sử dụng tùy chọn -i:

uniq -i words.txt

Kết quả sẽ là:

apple
banana

Ví dụ 5: Bỏ qua một số trường hoặc ký tự đầu tiên

Giả sử bạn có một tập tin data.txt chứa dữ liệu với định dạng "ID Tên Giá trị":

1 Alice 10
2 Bob 20
3 Alice 15

Nếu bạn chỉ muốn so sánh các dòng dựa trên tên, bạn có thể bỏ qua trường ID đầu tiên bằng tùy chọn -f 1:

uniq -f 1 data.txt

Kết quả sẽ là:

1 Alice 10
2 Bob 20

Tương tự, bạn có thể sử dụng -s N để bỏ qua N ký tự đầu tiên của mỗi dòng.

Sử dụng uniq với các lệnh khác

Một trong những điểm mạnh của uniq là khả năng kết hợp với các lệnh khác thông qua pipe (|). Điều này cho phép bạn xử lý dữ liệu một cách linh hoạt và mạnh mẽ. Ví dụ:

  • Sắp xếp và loại bỏ trùng lặp: sort data.txt | uniq (sắp xếp các dòng trong data.txt và sau đó loại bỏ các dòng trùng lặp). Lưu ý rằng uniq chỉ hoạt động với các dòng trùng lặp liền kề. Do đó, bạn cần sắp xếp dữ liệu trước khi sử dụng uniq.
  • Tìm các dòng trùng lặp trong một tập tin log lớn: cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10 (lấy cột đầu tiên (địa chỉ IP) từ access.log, sắp xếp, đếm số lần xuất hiện của mỗi IP, sắp xếp theo số lượng giảm dần và hiển thị 10 IP xuất hiện nhiều nhất).

So sánh uniq với các công cụ khác

Ngoài uniq, còn có một số công cụ khác có thể được sử dụng để loại bỏ các dòng trùng lặp. Dưới đây là so sánh ngắn gọn với một số công cụ phổ biến:

Công cụ Ưu điểm Nhược điểm Trường hợp sử dụng
uniq Đơn giản, nhanh chóng, dễ sử dụng. Chỉ hoạt động với các dòng trùng lặp liền kề; không thể loại bỏ trùng lặp không liền kề. Loại bỏ trùng lặp trong các tập tin đã được sắp xếp.
sort -u Loại bỏ trùng lặp và sắp xếp dữ liệu cùng một lúc. Có thể chậm hơn uniq đối với các tập tin lớn. Loại bỏ trùng lặp và sắp xếp dữ liệu.
awk '!seen[$0]++' Loại bỏ trùng lặp không liền kề. Cú pháp phức tạp hơn. Loại bỏ trùng lặp trong các tập tin không được sắp xếp.
sed '$!N; /^\(.\)\n\1$/!P; D' Loại bỏ trùng lặp liền kề. Cú pháp phức tạp, khó nhớ. Tương tự như uniq, nhưng với cú pháp khác.

Lựa chọn công cụ nào phụ thuộc vào nhu cầu cụ thể của bạn. Nếu bạn chỉ cần loại bỏ các dòng trùng lặp liền kề trong một tập tin đã được sắp xếp, uniq là một lựa chọn tốt. Nếu bạn cần loại bỏ trùng lặp không liền kề, awk có thể là lựa chọn phù hợp hơn. Và nếu bạn muốn loại bỏ trùng lặp và sắp xếp dữ liệu cùng một lúc, sort -u là một lựa chọn tiện lợi.

Các tình huống thực tế sử dụng lệnh uniq

Dưới đây là một số tình huống thực tế mà bạn có thể sử dụng lệnh uniq:

  • Phân tích log: Tìm kiếm các lỗi hoặc sự kiện xảy ra thường xuyên nhất trong một tập tin log.
  • Xử lý dữ liệu thống kê: Loại bỏ các bản ghi trùng lặp để đảm bảo tính chính xác của dữ liệu thống kê.
  • Làm sạch dữ liệu: Loại bỏ các dòng trùng lặp trong một tập tin dữ liệu trước khi thực hiện các phân tích hoặc xử lý khác.
  • Tạo danh sách duy nhất: Tạo một danh sách duy nhất từ một tập hợp các mục có thể chứa các mục trùng lặp. Ví dụ: tạo danh sách duy nhất các email từ danh sách liên hệ.
  • Kiểm tra tính duy nhất: Xác minh rằng một tập tin hoặc danh sách không chứa bất kỳ mục trùng lặp nào.

FAQ về lệnh uniq

Tại sao uniq chỉ hoạt động với các dòng trùng lặp liền kề?

uniq được thiết kế để hoạt động nhanh chóng và hiệu quả. Việc so sánh tất cả các dòng trong tập tin để tìm kiếm các dòng trùng lặp không liền kề sẽ tốn nhiều thời gian và tài nguyên hơn. Do đó, uniq chỉ so sánh các dòng liên tiếp để tối ưu hóa hiệu suất.

Làm thế nào để loại bỏ các dòng trùng lặp không liền kề?

Bạn có thể sử dụng các công cụ khác như sort -u hoặc awk '!seen[$0]++' để loại bỏ các dòng trùng lặp không liền kề.

uniq có phân biệt chữ hoa chữ thường không?

Mặc định, uniq phân biệt chữ hoa chữ thường. Bạn có thể sử dụng tùy chọn -i để bỏ qua sự khác biệt về chữ hoa chữ thường.

Làm thế nào để sử dụng uniq với các tập tin lớn?

uniq thường hoạt động tốt với các tập tin lớn. Tuy nhiên, nếu bạn gặp vấn đề về hiệu suất, bạn có thể thử sử dụng các tùy chọn như -s hoặc -w để giới hạn số lượng ký tự được so sánh.

Kết luận

Lệnh uniq là một công cụ đơn giản nhưng vô cùng hữu ích trong Linux để loại bỏ các dòng trùng lặp. Với cú pháp dễ hiểu và các tùy chọn linh hoạt, uniq giúp bạn tiết kiệm thời gian và công sức trong việc phân tích và xử lý dữ liệu. Hãy thử sử dụng uniq trong công việc hàng ngày của bạn và khám phá những lợi ích mà nó mang lại!

Hy vọng bài viết này đã cung cấp cho bạn một cái nhìn tổng quan về lệnh uniq. Nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào, đừng ngần ngại để lại bình luận bên dưới. Chúc bạn thành công!

Last Updated : 22/08/2025