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 處理含特殊字元檔名 |
# 統計存取日誌中各 IP 出現次數,按數量降序
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# 提取 ERROR 行,去除時間戳後比較內容
grep "ERROR" app.log | sed 's/^\[.*\] //' | sort | uniq -d
# 統計 URL 路徑出現次數,僅看出現 1 次的
awk '{print $7}' access.log | sort | uniq -u
# 日誌格式: 2023-10-01 10:00:00 [INFO] message
# 跳過前 20 個字元 (日期時間) 比較
sort app.log | uniq -s 20 -c
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 忽略干擾欄位,能讓日誌分析事半功倍。