Lệnh uniq trong Linux — Loại bỏ các dòng trùng lặp

Bạn đã bao giờ rơi vào tình huống phải xử lý một tệp log khổng lồ trên VPS, nơi các dòng dữ liệu trùng lặp xuất hiện dày đặc khiến việc kiểm tra lỗi trở nên vô cùng khó khăn chưa nhỉ? Với tư cách là một Senior System Admin, mình đã từng phải mất hàng giờ để lọc thủ công trước khi biết đến sự tồn tại của một công cụ cực kỳ hữu ích. Vậy uniq là gì và tại sao nó lại là "cứu cánh" trong quản trị hệ thống đến thế? Thực tế, uniq Linux là một lệnh chuyên dụng để lọc các dòng trùng lặp trong một tệp đã được sắp xếp. Hiểu rõ cách dùng uniq sẽ giúp bạn tối ưu hóa quy trình xử lý dữ liệu một cách nhanh chóng. Trong bài viết này, mình sẽ hướng dẫn bạn cách lọc dòng trùng lặp hiệu quả nhất để bạn có thể làm chủ hoàn toàn các tác vụ quản lý dữ liệu trên server của mình, đúng không nào?

Cần chuẩn bị gì trước khi dùng lệnh uniq?

  • Quyền user: Có thể sử dụng với quyền user thường.
  • Distro/OS hỗ trợ: Hỗ trợ trên hầu hết các bản phân phối Linux (Ubuntu, Debian, CentOS, RHEL...) và các hệ điều hành dựa trên Unix như macOS.
  • Package dependencies: Lệnh thuộc gói coreutils, thường được cài đặt sẵn mặc định trên mọi hệ thống Linux.

Cú pháp lệnh uniq là gì?

Lệnh uniq hỗ trợ 1 dạng cú pháp chính trên các hệ thống Linux/Unix.

uniq [OPTIONS] [INPUT]

Các tùy chọn của lệnh uniq là gì?

Lệnh uniq cung cấp các tùy chọn thuộc hai nhóm chính: kiểm soát cách phát hiện dòng trùng lặp và kiểm soát định dạng đầu ra.

Tùy chọn ngắn Tùy chọn dài Mô tả
-c --count uniq -c thêm số lần xuất hiện của mỗi dòng vào đầu dòng đầu ra.
-d --repeated uniq -d chỉ in các dòng xuất hiện nhiều hơn một lần, mỗi nhóm in một dòng.
-D uniq -D in tất cả các dòng trùng lặp, không rút gọn về một dòng đại diện.
--all-repeated[=METHOD] uniq --all-repeated in tất cả dòng trùng lặp. METHOD có thể là none, prepend hoặc separate để kiểm soát dấu phân cách giữa các nhóm.
-f N --skip-fields=N uniq -f N bỏ qua N trường đầu tiên khi so sánh dòng. Trường được phân tách bằng khoảng trắng.
--group[=METHOD] uniq --group in tất cả các dòng, thêm dòng trống để phân cách giữa các nhóm. METHOD có thể là separate, prepend, append hoặc both.
-i --ignore-case uniq -i bỏ qua sự khác biệt chữ hoa và chữ thường khi so sánh các dòng.
-s N --skip-chars=N uniq -s N bỏ qua N ký tự đầu tiên của mỗi dòng khi thực hiện so sánh.
-u --unique uniq -u chỉ in các dòng không có dòng nào trùng lặp trong đầu vào.
-w N --check-chars=N uniq -w N chỉ so sánh tối đa N ký tự đầu tiên của mỗi dòng, bỏ qua phần còn lại.
-z --zero-terminated uniq -z sử dụng ký tự null thay cho ký tự xuống dòng làm dấu kết thúc dòng trong đầu vào và đầu ra.
--help uniq --help hiển thị thông tin trợ giúp về cú pháp và các tùy chọn của lệnh rồi thoát.
--version uniq --version hiển thị thông tin phiên bản của lệnh rồi thoát.

xem thêm: Text Processing and Editing

Lệnh uniq được sử dụng như thế nào trong thực tế?

Dưới đây là các kịch bản ứng dụng lệnh uniq để xử lý dữ liệu trùng lặp trong quản trị hệ thống và xử lý log.

uniq là gì? [Loại bỏ các dòng trùng lặp liên tiếp]

sort names.txt | uniq
[Alice]
[Bob]
[Charlie]

Lệnh lọc các dòng trùng lặp đứng cạnh nhau sau khi đã được sắp xếp. Trong thực tế, việc kết hợp với sort là bắt buộc để đảm bảo tất cả các dòng trùng lặp trong toàn bộ tệp đều được xử lý.

uniq -c là gì? [Đếm số lần xuất hiện của mỗi dòng]

sort access.log | uniq -c
[   5 192.168.1.1]
[  12 192.168.1.5]
[   2 10.0.0.3]

Lệnh hiển thị số lượng dòng trùng lặp đứng trước mỗi dòng dữ liệu. Trên môi trường production, kỹ thuật này giúp sysadmin nhanh chóng thống kê tần suất truy cập của các địa chỉ IP trong file log.

uniq -d là gì? [Chỉ hiển thị các dòng bị trùng]

sort users.txt | uniq -d
[admin]
[guest]

Lệnh chỉ xuất ra những dòng có sự xuất hiện từ hai lần trở lên. Trong các trường hợp kiểm tra bảo mật, lệnh này cho phép bạn phát hiện nhanh các tài khoản hoặc tiến trình đang bị trùng lặp bất thường.

uniq -u là gì? [Chỉ hiển thị các dòng duy nhất]

sort data.txt | uniq -u
[unique_id_01]
[unique_id_05]

Lệnh lọc ra những dòng không có bất kỳ sự trùng lặp nào trong tệp. Trong các quy trình kiểm tra tính toàn vẹn của dữ liệu, lệnh này giúp xác định các phần tử độc nhất chưa từng xuất hiện trước đó.

uniq kết hợp với awk và sort là gì? [Tìm top các giá trị xuất hiện nhiều nhất]

cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 5
[  50 192.168.1.1]
[  30 172.16.0.5]
[  15 10.0.0.1]
[  10 192.168.1.10]
[   5 8.8.8.8]

Lệnh kết hợp pipe để trích xuất cột dữ liệu, đếm số lần xuất hiện và sắp xếp theo thứ tự giảm dần. Đây là kỹ thuật quan trọng trong automation script để phân tích nhanh các top nguồn tấn công hoặc top user hoạt động mạnh nhất trên hệ thống.

Lệnh uniq hoạt động không như mong đợi và các lỗi thường gặp là gì?

Trong quá trình quản trị hệ thống và xử lý dữ liệu văn bản, người dùng thường gặp phải các tình huống lệnh uniq không loại bỏ hết các dòng trùng lặp hoặc không hoạt động chính xác trên tệp dữ liệu chưa được sắp xếp.

Lệnh uniq không loại bỏ được các dòng trùng lặp nằm cách xa nhau

cat names.txt
Alice
Bob
Alice
Charlie
uniq names.txt
Alice
Bob
Alice
Charlie

Lệnh uniq chỉ có khả năng so sánh các dòng nằm kề nhau, dẫn đến việc các dòng trùng lặp nhưng bị ngăn cách bởi dòng khác sẽ không bị loại bỏ.

Sử dụng uniq để đếm số lần xuất hiện nhưng kết quả không chính xác

echo -e "apple\napple\norange\napple" | uniq -c
1 apple
1 orange
1 apple

Khi dữ liệu chưa được sắp xếp, tham số -c sẽ đếm số lần xuất hiện của các dòng trùng lặp theo từng cụm liên tiếp thay vì tổng số lần xuất hiện của toàn bộ tệp.

Lỗi không tìm thấy các dòng trùng lặp do khác biệt về khoảng trắng

echo -e "user1 \nuser1" | uniq -c
1 user1 
1 user1

Sự khác biệt về khoảng trắng ở cuối dòng khiến lệnh uniq coi hai dòng là các thực thể khác nhau, dẫn đến việc không thể nhận diện sự trùng lặp.

Thực hiện loại bỏ dòng trùng lặp nhưng không thay đổi tệp gốc

uniq data.txt
cat data.txt
[nội dung cũ vẫn còn nguyên]

Lệnh uniq mặc định chỉ xuất dữ liệu đã xử lý ra terminal (standard output) và không tự động ghi đè lên tệp tin gốc nếu không sử dụng các kỹ thuật điều hướng dòng lệnh.

Quy trình thực tế dùng lệnh uniq trong quản lý log server Linux?

Trong quá trình vận hành hệ thống, lệnh uniq thường được kết hợp với các công cụ xử lý văn bản khác để phân tích tệp nhật ký (log file) nhằm phát hiện các sự kiện lặp lại hoặc lỗi hệ thống.

Bước 1: Sắp xếp dữ liệu đầu vào bằng sort

sort access.log | uniq -c
      2 access.log
     15 192.168.1.1
     45 192.168.1.5

Vì lệnh uniq chỉ hoạt động trên các dòng liền kề, việc sử dụng sort trước khi dùng uniq giúp đếm chính xác số lần xuất hiện của từng địa chỉ IP trong tệp log.

Bước 2: Lọc các dòng dữ liệu duy nhất

sort access.log | uniq > unique_access.log

Trong trường hợp cần loại bỏ hoàn toàn các bản ghi trùng lặp để tạo một danh sách sạch, kết quả sẽ được lưu trữ vào một tệp mới.

Bước 3: Tìm kiếm các truy cập bất thường (dòng lặp lại)

sort access.log | uniq -d
192.168.1.1
192.168.1.5

Sử dụng tùy chọn -d cho phép bạn xác định nhanh các giá trị xuất hiện từ hai lần trở lên, hỗ trợ việc phát hiện các hành vi truy cập lặp lại bất thường từ một nguồn.

Vui lòng cung cấp tên lệnh {COMMAND_NAME} để tôi có thể phân tích insight và soạn thảo nội dung chính xác nhất theo đúng yêu cầu kỹ thuật của bạn.

Những câu hỏi thường gặp về lệnh uniq?

Dưới đây là các tình huống phổ biến mà người dùng thường gặp phải khi sử dụng lệnh uniq để xử lý dữ liệu văn bản.

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

Lệnh uniq mặc định sẽ loại bỏ các dòng lặp lại liên tiếp trong tệp tin.

sort file.txt | uniq
[nội dung file sau khi đã lọc bỏ các dòng trùng lặp]

Làm sao để chỉ hiển thị các dòng bị trùng lặp?

Sử dụng tham số -d để chỉ xuất ra các dòng xuất hiện nhiều hơn một lần trong dữ liệu.

sort file.txt | uniq -d
[danh sách các dòng bị trùng]

Làm thế nào để chỉ hiển thị các dòng duy nhất không bị trùng?

Tham số -u cho phép bạn chỉ lấy các dòng xuất hiện đúng một lần duy nhất trong tệp.

sort file.txt | uniq -u
[danh sách các dòng không có bản sao nào khác]

Cách đếm số lần xuất hiện của mỗi dòng là gì?

Sử dụng tham số -c để thêm một cột số lượng trước mỗi dòng dữ liệu.

sort file.txt | uniq -c
3 apple
2 orange
1 banana

Làm thế nào để bỏ qua sự khác biệt giữa chữ hoa và chữ thường?

Tham số -i cho phép lệnh coi các ký tự chữ hoa và chữ thường là giống nhau khi so sánh.

sort file.txt | uniq -i
[kết quả lọc bỏ trùng lặp không phân biệt hoa thường]

Tại sao lệnh uniq không hoạt động chính xác trên tệp của tôi?

Lệnh uniq chỉ so sánh các dòng đứng cạnh nhau, do đó bạn cần sử dụng lệnh sort trước khi dùng uniq để đảm bảo các dòng giống nhau được nhóm lại.

# Cách làm sai
uniq file.txt

# Cách làm đúng
sort file.txt | uniq

Lệnh uniq là một công cụ mạnh mẽ giúp bạn lọc và loại bỏ các dòng trùng lặp trong các tệp văn bản đã được sắp xếp. Bạn có thể sử dụng tham số -c để đếm số lần xuất hiện của mỗi dòng, giúp thống kê dữ liệu nhanh chóng, hay dùng tham số -d để chỉ hiển thị những dòng thực sự bị lặp lại khi cần kiểm tra lỗi dữ liệu, đúng không nhỉ? Việc nắm vững lệnh này chắc chắn sẽ giúp quá trình xử lý dữ liệu của bạn trở nên vô cùng hiệu quả và chuyên nghiệp hơn rất nhiều. Chúc bạn thành công!