Linux 命令uniq經(jīng)典操作示例
概述
uniq 命令是對連續(xù)重復(fù)行去重/統(tǒng)計的工具,常與 sort 配合使用(先排序讓重復(fù)行連續(xù),再去重),核心用于文本去重、統(tǒng)計重復(fù)行出現(xiàn)次數(shù),是處理日志、數(shù)據(jù)清單的高頻組合工具,注意:直接對未排序文件使用 uniq 僅能去除相鄰的重復(fù)行,無法處理非連續(xù)的重復(fù)行。
資料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
一、基本語法
uniq [選項] [輸入文件 [輸出文件]]
- 無輸入文件時,默認(rèn)讀取標(biāo)準(zhǔn)輸入(最常用:配合管道
sort 文件名 | uniq); - 可指定輸出文件,將處理結(jié)果寫入(替代重定向
>); - 核心前提:僅處理連續(xù)的重復(fù)行,非連續(xù)重復(fù)行不會被識別。
二、核心默認(rèn)行為
對連續(xù)重復(fù)行去重,僅保留一行,非連續(xù)重復(fù)行原樣輸出。
示例:未排序文件 test.txt
apple apple banana apple banana banana
直接執(zhí)行 uniq test.txt,輸出:
apple banana apple banana
(僅去除了相鄰的重復(fù)行,非連續(xù)的apple/banana仍保留)
三、常用選項(高頻且簡潔,無冗余選項)
uniq 的選項圍繞去重、統(tǒng)計、顯示重復(fù)行設(shè)計,所有選項均可組合使用,覆蓋99%場景:
| 選項 | 英文全稱 | 作用 | 實用場景 | 示例效果(基于上述test.txt,先sort再uniq) |
|---|---|---|---|---|
-c | --count | 統(tǒng)計每行出現(xiàn)的次數(shù),次數(shù)在前,內(nèi)容在后 | 統(tǒng)計日志中重復(fù)IP/關(guān)鍵詞的出現(xiàn)頻次 | 2 apple3 banana |
-d | --repeated | 僅顯示連續(xù)重復(fù)的行(至少出現(xiàn)2次),且僅保留一行 | 篩選出有重復(fù)的內(nèi)容,排除唯一行 | applebanana |
-D | --all-repeated | 顯示所有的連續(xù)重復(fù)行(保留所有重復(fù)實例) | 查看重復(fù)行的全部原始內(nèi)容 | appleapplebananabananabanana |
-u | --unique | 僅顯示唯一的行(從未連續(xù)重復(fù)的行) | 篩選出無重復(fù)的內(nèi)容 | 若文件無唯一行則無輸出 |
-f N | --skip-fields=N | 忽略前N列,按剩余內(nèi)容判斷是否重復(fù) | 按指定列去重(如忽略ID列,按內(nèi)容去重) | 例:1 apple/2 apple,-f1視為重復(fù)行 |
-s N | --skip-chars=N | 忽略前N個字符,按剩余內(nèi)容判斷是否重復(fù) | 按字符位置去重(如忽略前綴,按后綴判斷) | 例:a123/b123,-s1視為重復(fù)行 |
-w N | --check-chars=N | 僅比較前N個字符,判斷是否重復(fù) | 僅按前N個字符去重/統(tǒng)計 | 例:apple1/apple2,-w5視為重復(fù)行 |
四、經(jīng)典實操示例(分基礎(chǔ)/進(jìn)階,覆蓋所有核心場景)
基礎(chǔ)場景:先排序再去重(最常用,必學(xué))
基于上述 test.txt,先通過 sort 讓重復(fù)行連續(xù),再用 uniq 處理:
# 1. 基礎(chǔ)去重(保留唯一行,去除所有重復(fù)行) sort test.txt | uniq # 輸出:apple / banana # 2. 統(tǒng)計重復(fù)次數(shù)(核心高頻) sort test.txt | uniq -c # 輸出:2 apple / 3 banana # 3. 僅顯示有重復(fù)的行(至少出現(xiàn)2次) sort test.txt | uniq -d # 輸出:apple / banana # 4. 僅顯示唯一行(無任何重復(fù)) # 新建含唯一行的文件test2.txt:apple/apple/banana/pear sort test2.txt | uniq -u # 輸出:pear
進(jìn)階場景1:按指定列/字符去重(-f/-s/-w)
處理結(jié)構(gòu)化文本 data.txt(ID 名稱 類型,按名稱去重,忽略ID列):
1 apple fruit 2 apple fruit 3 banana fruit 4 apple veg 5 orange fruit
# -f1:忽略前1列(ID列),按剩余內(nèi)容判斷重復(fù) sort data.txt | uniq -f1 # 輸出: # 1 apple fruit # 4 apple veg # 3 banana fruit # 5 orange fruit # -w6:僅比較前6個字符,判斷重復(fù)(1 apple / 2 apple 前6字符一致) sort data.txt | uniq -w6 -c # 輸出: # 3 1 apple fruit # 1 5 orange fruit
進(jìn)階場景2:組合選項(統(tǒng)計+顯示所有重復(fù)行)
# 顯示所有重復(fù)行,并統(tǒng)計每行總次數(shù)(先統(tǒng)計再篩選,需配合awk) sort test.txt | uniq -c | awk '$1>1' # 輸出:2 apple / 3 banana(等價sort+uniq -d,且?guī)Т螖?shù)) # 顯示所有重復(fù)的原始行,并寫入新文件 sort test.txt | uniq -D > repeat_lines.txt
進(jìn)階場景3:與其他命令配合(日志統(tǒng)計實戰(zhàn))
統(tǒng)計Nginx訪問日志 access.log 中訪問次數(shù)最多的前5個IP:
# 提取IP列 → 排序 → 統(tǒng)計次數(shù) → 按次數(shù)降序 → 取前5
grep -o "\b[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\b" access.log | sort | uniq -c | sort -nr | head -5五、與sort -u的核心區(qū)別(易混淆,必分清)
sort -u 和 sort | uniq 均能實現(xiàn)全局去重,但功能側(cè)重不同,按需選擇:
| 命令組合 | 核心功能 | 額外能力 | 適用場景 |
|---|---|---|---|
sort -u 文件名 | 排序+全局去重,一步完成 | 無統(tǒng)計、篩選功能,僅去重 | 僅需去重,無需統(tǒng)計重復(fù)次數(shù) |
| `sort 文件名 | uniq` | 排序+全局去重,兩步完成 | 可配合-c/-d/-u實現(xiàn)統(tǒng)計/篩選 |
| `sort 文件名 | uniq -c` | 排序+去重+統(tǒng)計次數(shù) | 核心統(tǒng)計能力,無替代方案 |
結(jié)論:僅去重用 sort -u(更高效);需統(tǒng)計/篩選重復(fù)行,必須用 sort | uniq 選項。
六、關(guān)鍵注意事項
- 核心前提:
uniq僅處理連續(xù)重復(fù)行,未排序文件直接使用會漏判非連續(xù)重復(fù)行,所有全局去重/統(tǒng)計場景,必須先sort; - 空行處理:空行視為普通行,連續(xù)空行會被去重/統(tǒng)計,可先用
grep -v "^$"過濾空行; - 空格/制表符:行首/行尾的空格會影響重復(fù)判斷(如
apple和apple視為不同行),可先用sed 's/^ *//;s/ *$//'去除首尾空格; - 輸出文件:指定輸出文件時,輸入文件和輸出文件不能為同一個文件(否則會清空文件);
- 超大文件:
uniq逐行處理,內(nèi)存占用極低,可配合sort處理GB級文本文件(如日志、數(shù)據(jù)文件)。
七、高頻組合用法(實戰(zhàn)必用,直接復(fù)用)
1. 文本全局去重(高效版)
sort file.txt -u > unique_file.txt
2. 統(tǒng)計重復(fù)行次數(shù)并按次數(shù)降序排列
sort file.txt | uniq -c | sort -nr
3. 篩選出僅出現(xiàn)一次的唯一行
sort file.txt | uniq -u
4. 篩選出重復(fù)出現(xiàn)的行(至少2次)并統(tǒng)計次數(shù)
sort file.txt | uniq -c | awk '$1 >= 2'
5. 處理結(jié)構(gòu)化文本:按指定列去重并統(tǒng)計
# 按第2列(逗號分隔)去重,統(tǒng)計次數(shù)(先按第2列排序,再忽略前1列去重) sort -t "," -k2 file.csv | uniq -f1 -c
總結(jié)
uniq 是連續(xù)重復(fù)行處理工具,核心價值是與sort配合實現(xiàn)全局去重/統(tǒng)計/篩選,日常使用的核心口訣:
- 僅去重:
sort -u一步到位; - 要統(tǒng)計/篩選:
sort | uniq -c/-d/-u組合使用; - 結(jié)構(gòu)化文本:
sort -t 分隔符 -k 列號 | uniq -f N按列處理。
到此這篇關(guān)于Linux 命令uniq經(jīng)典操作示例的文章就介紹到這了,更多相關(guān)Linux 命令uniq內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux中shell腳本發(fā)現(xiàn)BUG和提高效率的神器—"set"方法
set是 Linux Shell 中的一個內(nèi)置命令,用于設(shè)置或顯示 shell 的選項和環(huán)境變量,以下是關(guān)于 set 命令的基礎(chǔ)概念、優(yōu)勢、類型、應(yīng)用場景以及常見問題的解答,嵌入式Linux研發(fā)人員和運(yùn)維人員,都會或多或少去查看編寫 shell 腳本,今天教大家set關(guān)鍵字方法輕松分析遇到的問題2025-08-08
Shell腳本實現(xiàn)根據(jù)文件的修改時間來分類文件
這篇文章主要介紹了Shell腳本實現(xiàn)根據(jù)文件的修改時間來分類文件,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-07-07
用shell腳本監(jiān)控進(jìn)程是否存在 不存在則啟動的實例
這篇文章主要介紹了用shell腳本監(jiān)控進(jìn)程是否存在 不存在則啟動的實例,需要的朋友可以參考下2016-03-03
關(guān)于Linux下動態(tài)查看實時日志的命令
這篇文章主要介紹了Linux下動態(tài)查看實時日志的命令,在Linux中實時顯示文件內(nèi)容的常用命令是tail命令,tail命令是實時顯示日志文件的最常用解決方案,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Shell腳本實現(xiàn)獲取網(wǎng)頁快照并生成縮略圖
這篇文章主要介紹了Shell腳本實現(xiàn)獲取網(wǎng)頁快照并生成縮略圖,本文獲取網(wǎng)頁快照使用phantomjs、生成縮略圖使用ImageMagick,需要的朋友可以參考下2015-02-02

