一、前言
在 Linux/Unix 系統中,uniq
是一個非常實用的文本處理命令,用于對重復的行進行統計、去重和篩選。它通常與 sort
搭配使用,以實現高效的文本數據清洗與統計分析。
無論是做日志分析、訪問頻率統計,還是編寫自動化腳本,uniq
都是一個不可或缺的工具。
本文將帶你全面了解 uniq
工具的使用方式,包括:
? uniq
的基本語法與常用參數
? 如何統計重復行、去重輸出、查找唯一行
? uniq
在 Shell 腳本中的實戰應用
? 與其他文本處理命令的聯合使用
? 實際開發中的常見問題與優化建議
并通過完整的代碼示例幫助你快速上手并熟練掌握 uniq
的各種高級用法。
二、什么是 uniq?
uniq
是一個用于 過濾或報告重復行 的命令行工具。它默認只會比較 相鄰的行,因此常與sort
結合使用。
? 典型用途包括:
場景 | 示例 |
---|---|
日志分析 | 提取唯一的 IP 地址 |
數據統計 | 統計某字段出現次數 |
自動化腳本 | 快速去重輸出結果 |
訪問監控 | 查找高頻訪問用戶 |
文件清理 | 去除重復行 |
三、uniq 基礎語法
uniq [選項] [輸入文件] [輸出文件]
? 常用選項說明:
參數 | 描述 |
---|---|
-c | 顯示每行出現的次數 |
-d | 只顯示重復的行(每組只輸出一次) |
-u | 只顯示唯一的行 |
-i | 忽略大小寫比較 |
-f N | 忽略前 N 個字段再比較 |
-s N | 忽略前 N 個字符再比較 |
-w N | 對每行前 N 個字符進行比較 |
四、uniq 使用示例
? 示例1:基礎去重輸出
echo -e "apple\nbanana\napple\norange" > fruits.txt
sort fruits.txt | uniq
輸出:
apple
banana
orange
?? 注意:
uniq
只會合并相鄰的相同行,所以必須先排序!
? 示例2:統計每行出現次數(-c
)
sort fruits.txt | uniq -c
輸出:
2 apple1 banana1 orange
? 示例3:只顯示重復行(-d
)
sort fruits.txt | uniq -d
輸出:
apple
? 示例4:只顯示唯一行(-u
)
sort fruits.txt | uniq -u
輸出:
banana
orange
? 示例5:忽略大小寫比較(-i
)
echo -e "Apple\napple\nBANANA" > mixed.txt
sort -f mixed.txt | uniq -i
輸出:
Apple
BANANA
五、uniq 在 Shell 腳本中的應用
? 示例1:統計訪問最多的 IP 地址
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -n 10
輸出類似:
123 192.168.1.100
98 192.168.1.101
...
? 示例2:提取配置文件中的唯一變量名
grep '=' config.env | cut -d'=' -f1 | sort | uniq
輸出所有變量名并去重。
? 示例3:查找重復的用戶名(從?/etc/passwd
)
cut -d':' -f1 /etc/passwd | sort | uniq -d
輸出重復的用戶名(如果有的話)。
六、uniq 與其他命令的配合使用
? 示例1:統計訪問最多的 URL(uniq
?+?cut
?+?sort
)
cut -d'"' -f2 access.log | cut -d' ' -f2 | sort | uniq -c | sort -nr | head -n 10
輸出訪問最多的前 10 個 URL。
? 示例2:找出未被訪問的頁面(uniq
?+?grep
)
comm -23 <(sort all_pages.txt) <(sort visited_pages.txt)
輸出在
all_pages.txt
中但不在visited_pages.txt
中的頁面。
? 示例3:結合?awk
?過濾特定數量的行
sort data.txt | uniq -c | awk '$1 >= 3'
輸出出現次數大于等于 3 的行。
七、uniq 使用技巧總結
技巧 | 說明 |
---|---|
? 總是先排序再使用?uniq | 否則無法識別非連續重復行 |
? 使用?-c ?統計出現次數 | 適用于訪問統計、頻率分析 |
? 使用?-d ?提取重復項 | 快速定位異常數據 |
? 使用?-u ?提取唯一項 | 快速獲取不重復數據 |
? 使用?-i ?忽略大小寫 | 更靈活匹配關鍵詞 |
? 結合?awk ?過濾特定頻率的數據 | 實現復雜邏輯 |
? 使用?comm ?找出差異 | 對比兩個文件內容 |
八、uniq 實戰案例匯總
? 案例1:從?/etc/passwd
?提取唯一用戶名
cut -d':' -f1 /etc/passwd | sort | uniq
? 案例2:統計訪問最多的 IP 并排序
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -n 10
? 案例3:找出兩個文件的交集
sort file1.txt file2.txt | uniq -d
九、常見問題與解決方法
問題 | 原因 | 解決方案 |
---|---|---|
無法識別非連續重復行 | 未使用?sort ?排序 | 添加?sort ?再調用?uniq |
去重無效 | 使用了錯誤參數 | 檢查是否使用了?-d ?或?-u |
輸出亂碼 | 編碼不一致 | 使用?iconv ?或設置?LANG=C |
忽略字段錯誤 | 參數?-f ?設置不當 | 檢查字段索引是否正確 |
統計結果異常 | 輸入數據格式混亂 | 使用?tr ?或?awk ?預處理 |
十、總結對比表:uniq 常用參數一覽
參數 | 功能 |
---|---|
-c | 顯示每行出現次數 |
-d | 只顯示重復行 |
-u | 只顯示唯一行 |
-i | 忽略大小寫 |
-f | 忽略前 N 個字段 |
-s | 忽略前 N 個字符 |
-w | 對每行前 N 字符進行比較 |
十一、結語
感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!