# uniq命令如何使用
## 一、uniq命令概述
`uniq`是Unix/Linux系統中一個非常實用的文本處理工具,主要用于**檢測和刪除連續重復的行**。它常與`sort`命令配合使用,因為`uniq`只能處理相鄰的重復行。該命令名稱源自"unique"(唯一)的縮寫,體現了其核心功能。
### 基本特點
- 默認行為:刪除連續的重復行
- 典型應用場景:日志分析、數據去重、文本統計
- 輸入要求:通常需要先對文件進行排序
- 輸出方式:默認輸出到標準輸出(stdout)
## 二、基本語法格式
```bash
uniq [選項] [輸入文件] [輸出文件]
如果不指定輸入文件,則從標準輸入讀取數據;如果不指定輸出文件,則結果輸出到標準輸出。
選項 | 功能描述 |
---|---|
-c |
在每行前顯示重復出現的次數 |
-d |
只顯示重復的行(每組重復行只顯示一次) |
-D |
顯示所有重復的行(包括原始行) |
-u |
只顯示不重復的行 |
-i |
忽略大小寫差異 |
-f N |
跳過前N個字段的比較 |
-s N |
跳過前N個字符的比較 |
-w N |
只比較每行的前N個字符 |
# 統計每行出現的次數(需先排序)
sort file.txt | uniq -c
# 找出所有重復行(包括原始行)
uniq -D duplicates.txt
# 忽略前2個字段比較重復行
uniq -f 2 data.csv
# 原始文件內容
$ cat fruits.txt
apple
orange
orange
banana
apple
apple
# 直接使用uniq(無效,因為重復行不相鄰)
$ uniq fruits.txt
apple
orange
orange
banana
apple
apple
# 先排序再去重
$ sort fruits.txt | uniq
apple
banana
orange
# 統計日志中各IP出現的次數
$ grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log | sort | uniq -c
45 192.168.1.1
12 192.168.1.2
3 192.168.1.3
# 找出只出現過一次的用戶名
$ sort users.log | uniq -u
# 忽略第一列比較重復行(適合CSV文件)
$ sort data.csv | uniq -f 1
# 只比較每行的前5個字符
$ uniq -w 5 long_lines.txt
# 合并多個文件后去重
$ sort file1.txt file2.txt | uniq > combined_uniq.txt
# 在所有.txt文件中查找重復內容
$ find . -name "*.txt" -exec cat {} \; | sort | uniq -d
原因:uniq只處理相鄰的重復行。解決方案:
sort file.txt | uniq
使用GNU擴展選項:
awk '!seen[$0]++' file.txt
結合tr命令:
tr -s ' ' < file.txt | sort | uniq
使用臨時文件分塊處理:
split -l 1000000 bigfile.txt chunk_
for f in chunk_*; do
sort $f | uniq > ${f}.uniq
done
sort -m chunk_*.uniq | uniq > final.txt
預處理優化:
grep
過濾無關內容awk
提取關鍵字段排序參數:
sort -u可以部分替代sort | uniq
并行處理:
# 使用GNU parallel加速
parallel --pipe --block 10M sort | uniq < bigfile.txt
命令 | 特點 | 適用場景 |
---|---|---|
sort -u |
去重同時排序 | 簡單去重需求 |
awk '!a[$0]++' |
保持原順序 | 需要保留首次出現的行 |
uniq |
需預排序 | 需要計數或提取重復項 |
# 統計訪問量前10的URL
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10
# 清理nginx配置中的重復指令
awk '{if ($0 ~ /^[[:space:]]*[^#]/) print $1}' nginx.conf | sort | uniq -d
# 使用MD5校驗找出重復文件
find . -type f -exec md5sum {} + | sort | uniq -Dw32
字符集問題:
LC_ALL=C
行尾空白:
-w
選項時注意行尾可能有不可見字符性能瓶頸:
版本差異:
uniq通常使用以下算法: 1. 讀取一行到緩沖區 2. 與下一行比較 3. 根據選項決定輸出行為 4. 循環直到文件結束
典型處理流程:
cat file | grep pattern | sort | uniq -c | sort -nr
Python實現示例:
from collections import Counter
with open('file.txt') as f:
print(Counter(f.readlines()))
uniq命令是Linux文本處理工具箱中的重要組件,掌握它可以: - 高效清理重復數據 - 快速統計頻率分布 - 精確提取特征信息
記住關鍵三點:
1. 總是先sort
再uniq
2. 活用-c
、-d
、-u
核心選項
3. 結合其他命令構建處理管道
通過本文介紹的各種技巧,您應該能夠應對大多數文本去重和分析場景。如需處理更復雜的需求,可以考慮使用awk
或專用數據分析工具。
“`
注:本文實際約2100字,包含了uniq命令的全面使用方法。Markdown格式便于直接發布到支持MD的博客或文檔系統。如需調整內容長度或重點,可以相應增減案例部分。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。