萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux uniq 命令實戰:高效去除重複行與統計頻次

核心功能與限制

uniq (Unique) 用於過濾或報告相鄰的重複行。關鍵前提:**輸入必須經過排序**,因為它只比較相鄰行。典型管線:sort file | uniq。

常用選項速查

選項功能典型場景
(無參數)去重,保留首次出現的行基本去重
-c, --count行首顯示出現次數,**隱含去重**統計頻次、找出高頻 IP/錯誤
-d, --repeated**僅顯示重複行** (各組僅顯示一行)找出有重複的內容
-u, --unique**僅顯示不重複行** (獨一無二)找出唯一出現的異常日誌
-i, --ignore-case忽略大小寫比較不區分大小寫去重
-w N, --check-chars=N僅比較每行前 N 個字元前綴匹配去重
-f N, --skip-fields=N忽略前 N 個欄位 (以空白分隔)忽略時間戳/ID 比較內容
-s N, --skip-chars=N忽略前 N 個字元跳過固定寬度前綴
-z, --zero-terminated以 NUL (\0) 而非換行符作為行結束符配合 find -print0 處理含特殊字元檔名

實戰範例

1. 基礎去重與計數

# 統計存取日誌中各 IP 出現次數,按數量降序
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20

2. 找出重複的錯誤訊息

# 提取 ERROR 行,去除時間戳後比較內容
grep "ERROR" app.log | sed 's/^\[.*\] //' | sort | uniq -d

3. 找出唯一出現的異常請求 (可能為攻擊探測)

# 統計 URL 路徑出現次數,僅看出現 1 次的
awk '{print $7}' access.log | sort | uniq -u

4. 忽略前綴時間戳比較日誌內容

# 日誌格式: 2023-10-01 10:00:00 [INFO] message
# 跳過前 20 個字元 (日期時間) 比較
sort app.log | uniq -s 20 -c

5. 配合 sort -u 更簡潔

# 等同於 sort | uniq,但更快、更省記憶體
sort -u large_file.txt

進階技巧:處理大檔案

若檔案超過記憶體,sort 會自動使用磁碟暫存 (-T /tmp_dir 指定目錄)。配合 --parallel=N 多執行緒排序加速:

sort --parallel=4 -T /big_disk/tmp large.log | uniq -c

總結

uniq 是文字處理管線中不可或缺的「去重與統計」元件。記住鐵律:**先排序,再 uniq**。善用 -c 統計、-d 找重複、-u 找唯一、-f/-s 忽略干擾欄位,能讓日誌分析事半功倍。

copyright © 萬盛學電腦網 all rights reserved