Linux 命令uniq經(jīng)典操作示例
概述
uniq 命令是對連續(xù)重復行去重/統(tǒng)計的工具,常與 sort 配合使用(先排序讓重復行連續(xù),再去重),核心用于文本去重、統(tǒng)計重復行出現(xiàn)次數(shù),是處理日志、數(shù)據(jù)清單的高頻組合工具,注意:直接對未排序文件使用 uniq 僅能去除相鄰的重復行,無法處理非連續(xù)的重復行。
資料合集: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 [選項] [輸入文件 [輸出文件]]
- 無輸入文件時,默認讀取標準輸入(最常用:配合管道
sort 文件名 | uniq); - 可指定輸出文件,將處理結(jié)果寫入(替代重定向
>); - 核心前提:僅處理連續(xù)的重復行,非連續(xù)重復行不會被識別。
二、核心默認行為
對連續(xù)重復行去重,僅保留一行,非連續(xù)重復行原樣輸出。
示例:未排序文件 test.txt
apple apple banana apple banana banana
直接執(zhí)行 uniq test.txt,輸出:
apple banana apple banana
(僅去除了相鄰的重復行,非連續(xù)的apple/banana仍保留)
三、常用選項(高頻且簡潔,無冗余選項)
uniq 的選項圍繞去重、統(tǒng)計、顯示重復行設計,所有選項均可組合使用,覆蓋99%場景:
| 選項 | 英文全稱 | 作用 | 實用場景 | 示例效果(基于上述test.txt,先sort再uniq) |
|---|---|---|---|---|
-c | --count | 統(tǒng)計每行出現(xiàn)的次數(shù),次數(shù)在前,內(nèi)容在后 | 統(tǒng)計日志中重復IP/關鍵詞的出現(xiàn)頻次 | 2 apple3 banana |
-d | --repeated | 僅顯示連續(xù)重復的行(至少出現(xiàn)2次),且僅保留一行 | 篩選出有重復的內(nèi)容,排除唯一行 | applebanana |
-D | --all-repeated | 顯示所有的連續(xù)重復行(保留所有重復實例) | 查看重復行的全部原始內(nèi)容 | appleapplebananabananabanana |
-u | --unique | 僅顯示唯一的行(從未連續(xù)重復的行) | 篩選出無重復的內(nèi)容 | 若文件無唯一行則無輸出 |
-f N | --skip-fields=N | 忽略前N列,按剩余內(nèi)容判斷是否重復 | 按指定列去重(如忽略ID列,按內(nèi)容去重) | 例:1 apple/2 apple,-f1視為重復行 |
-s N | --skip-chars=N | 忽略前N個字符,按剩余內(nèi)容判斷是否重復 | 按字符位置去重(如忽略前綴,按后綴判斷) | 例:a123/b123,-s1視為重復行 |
-w N | --check-chars=N | 僅比較前N個字符,判斷是否重復 | 僅按前N個字符去重/統(tǒng)計 | 例:apple1/apple2,-w5視為重復行 |
四、經(jīng)典實操示例(分基礎/進階,覆蓋所有核心場景)
基礎場景:先排序再去重(最常用,必學)
基于上述 test.txt,先通過 sort 讓重復行連續(xù),再用 uniq 處理:
# 1. 基礎去重(保留唯一行,去除所有重復行) sort test.txt | uniq # 輸出:apple / banana # 2. 統(tǒng)計重復次數(shù)(核心高頻) sort test.txt | uniq -c # 輸出:2 apple / 3 banana # 3. 僅顯示有重復的行(至少出現(xiàn)2次) sort test.txt | uniq -d # 輸出:apple / banana # 4. 僅顯示唯一行(無任何重復) # 新建含唯一行的文件test2.txt:apple/apple/banana/pear sort test2.txt | uniq -u # 輸出:pear
進階場景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)容判斷重復 sort data.txt | uniq -f1 # 輸出: # 1 apple fruit # 4 apple veg # 3 banana fruit # 5 orange fruit # -w6:僅比較前6個字符,判斷重復(1 apple / 2 apple 前6字符一致) sort data.txt | uniq -w6 -c # 輸出: # 3 1 apple fruit # 1 5 orange fruit
進階場景2:組合選項(統(tǒng)計+顯示所有重復行)
# 顯示所有重復行,并統(tǒng)計每行總次數(shù)(先統(tǒng)計再篩選,需配合awk) sort test.txt | uniq -c | awk '$1>1' # 輸出:2 apple / 3 banana(等價sort+uniq -d,且?guī)Т螖?shù)) # 顯示所有重復的原始行,并寫入新文件 sort test.txt | uniq -D > repeat_lines.txt
進階場景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)計重復次數(shù) |
| `sort 文件名 | uniq` | 排序+全局去重,兩步完成 | 可配合-c/-d/-u實現(xiàn)統(tǒng)計/篩選 |
| `sort 文件名 | uniq -c` | 排序+去重+統(tǒng)計次數(shù) | 核心統(tǒng)計能力,無替代方案 |
結(jié)論:僅去重用 sort -u(更高效);需統(tǒng)計/篩選重復行,必須用 sort | uniq 選項。
六、關鍵注意事項
- 核心前提:
uniq僅處理連續(xù)重復行,未排序文件直接使用會漏判非連續(xù)重復行,所有全局去重/統(tǒng)計場景,必須先sort; - 空行處理:空行視為普通行,連續(xù)空行會被去重/統(tǒng)計,可先用
grep -v "^$"過濾空行; - 空格/制表符:行首/行尾的空格會影響重復判斷(如
apple和apple視為不同行),可先用sed 's/^ *//;s/ *$//'去除首尾空格; - 輸出文件:指定輸出文件時,輸入文件和輸出文件不能為同一個文件(否則會清空文件);
- 超大文件:
uniq逐行處理,內(nèi)存占用極低,可配合sort處理GB級文本文件(如日志、數(shù)據(jù)文件)。
七、高頻組合用法(實戰(zhàn)必用,直接復用)
1. 文本全局去重(高效版)
sort file.txt -u > unique_file.txt
2. 統(tǒng)計重復行次數(shù)并按次數(shù)降序排列
sort file.txt | uniq -c | sort -nr
3. 篩選出僅出現(xiàn)一次的唯一行
sort file.txt | uniq -u
4. 篩選出重復出現(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ù)重復行處理工具,核心價值是與sort配合實現(xiàn)全局去重/統(tǒng)計/篩選,日常使用的核心口訣:
- 僅去重:
sort -u一步到位; - 要統(tǒng)計/篩選:
sort | uniq -c/-d/-u組合使用; - 結(jié)構(gòu)化文本:
sort -t 分隔符 -k 列號 | uniq -f N按列處理。
到此這篇關于Linux 命令uniq經(jīng)典操作示例的文章就介紹到這了,更多相關Linux 命令uniq內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Linux忘記root密碼進入單用戶模式切換運行級別切換用戶
這篇文章主要介紹了Linux忘記root密碼進入單用戶模式切換運行級別切換用戶,需要的朋友可以參考下2019-08-08

