Linux 命令uniq经典操作示例
作者:hweiyu00
概述
uniq 命令是对连续重复行去重/统计的工具,常与 sort 配合使用(先排序让重复行连续,再去重),核心用于文本去重、统计重复行出现次数,是处理日志、数据清单的高频组合工具,注意:直接对未排序文件使用 uniq 仅能去除相邻的重复行,无法处理非连续的重复行。
资料合集: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); - 可指定输出文件,将处理结果写入(替代重定向
>); - 核心前提:仅处理连续的重复行,非连续重复行不会被识别。
二、核心默认行为
对连续重复行去重,仅保留一行,非连续重复行原样输出。
示例:未排序文件 test.txt
apple apple banana apple banana banana
直接执行 uniq test.txt,输出:
apple banana apple banana
(仅去除了相邻的重复行,非连续的apple/banana仍保留)
三、常用选项(高频且简洁,无冗余选项)
uniq 的选项围绕去重、统计、显示重复行设计,所有选项均可组合使用,覆盖99%场景:
| 选项 | 英文全称 | 作用 | 实用场景 | 示例效果(基于上述test.txt,先sort再uniq) |
|---|---|---|---|---|
-c | --count | 统计每行出现的次数,次数在前,内容在后 | 统计日志中重复IP/关键词的出现频次 | 2 apple3 banana |
-d | --repeated | 仅显示连续重复的行(至少出现2次),且仅保留一行 | 筛选出有重复的内容,排除唯一行 | applebanana |
-D | --all-repeated | 显示所有的连续重复行(保留所有重复实例) | 查看重复行的全部原始内容 | appleapplebananabananabanana |
-u | --unique | 仅显示唯一的行(从未连续重复的行) | 筛选出无重复的内容 | 若文件无唯一行则无输出 |
-f N | --skip-fields=N | 忽略前N列,按剩余内容判断是否重复 | 按指定列去重(如忽略ID列,按内容去重) | 例:1 apple/2 apple,-f1视为重复行 |
-s N | --skip-chars=N | 忽略前N个字符,按剩余内容判断是否重复 | 按字符位置去重(如忽略前缀,按后缀判断) | 例:a123/b123,-s1视为重复行 |
-w N | --check-chars=N | 仅比较前N个字符,判断是否重复 | 仅按前N个字符去重/统计 | 例:apple1/apple2,-w5视为重复行 |
四、经典实操示例(分基础/进阶,覆盖所有核心场景)
基础场景:先排序再去重(最常用,必学)
基于上述 test.txt,先通过 sort 让重复行连续,再用 uniq 处理:
# 1. 基础去重(保留唯一行,去除所有重复行) sort test.txt | uniq # 输出:apple / banana # 2. 统计重复次数(核心高频) sort test.txt | uniq -c # 输出:2 apple / 3 banana # 3. 仅显示有重复的行(至少出现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)
处理结构化文本 data.txt(ID 名称 类型,按名称去重,忽略ID列):
1 apple fruit 2 apple fruit 3 banana fruit 4 apple veg 5 orange fruit
# -f1:忽略前1列(ID列),按剩余内容判断重复 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:组合选项(统计+显示所有重复行)
# 显示所有重复行,并统计每行总次数(先统计再筛选,需配合awk) sort test.txt | uniq -c | awk '$1>1' # 输出:2 apple / 3 banana(等价sort+uniq -d,且带次数) # 显示所有重复的原始行,并写入新文件 sort test.txt | uniq -D > repeat_lines.txt
进阶场景3:与其他命令配合(日志统计实战)
统计Nginx访问日志 access.log 中访问次数最多的前5个IP:
# 提取IP列 → 排序 → 统计次数 → 按次数降序 → 取前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的核心区别(易混淆,必分清)
sort -u 和 sort | uniq 均能实现全局去重,但功能侧重不同,按需选择:
| 命令组合 | 核心功能 | 额外能力 | 适用场景 |
|---|---|---|---|
sort -u 文件名 | 排序+全局去重,一步完成 | 无统计、筛选功能,仅去重 | 仅需去重,无需统计重复次数 |
| `sort 文件名 | uniq` | 排序+全局去重,两步完成 | 可配合-c/-d/-u实现统计/筛选 |
| `sort 文件名 | uniq -c` | 排序+去重+统计次数 | 核心统计能力,无替代方案 |
结论:仅去重用 sort -u(更高效);需统计/筛选重复行,必须用 sort | uniq 选项。
六、关键注意事项
- 核心前提:
uniq仅处理连续重复行,未排序文件直接使用会漏判非连续重复行,所有全局去重/统计场景,必须先sort; - 空行处理:空行视为普通行,连续空行会被去重/统计,可先用
grep -v "^$"过滤空行; - 空格/制表符:行首/行尾的空格会影响重复判断(如
apple和apple视为不同行),可先用sed 's/^ *//;s/ *$//'去除首尾空格; - 输出文件:指定输出文件时,输入文件和输出文件不能为同一个文件(否则会清空文件);
- 超大文件:
uniq逐行处理,内存占用极低,可配合sort处理GB级文本文件(如日志、数据文件)。
七、高频组合用法(实战必用,直接复用)
1. 文本全局去重(高效版)
sort file.txt -u > unique_file.txt
2. 统计重复行次数并按次数降序排列
sort file.txt | uniq -c | sort -nr
3. 筛选出仅出现一次的唯一行
sort file.txt | uniq -u
4. 筛选出重复出现的行(至少2次)并统计次数
sort file.txt | uniq -c | awk '$1 >= 2'
5. 处理结构化文本:按指定列去重并统计
# 按第2列(逗号分隔)去重,统计次数(先按第2列排序,再忽略前1列去重) sort -t "," -k2 file.csv | uniq -f1 -c
总结
uniq 是连续重复行处理工具,核心价值是与sort配合实现全局去重/统计/筛选,日常使用的核心口诀:
- 仅去重:
sort -u一步到位; - 要统计/筛选:
sort | uniq -c/-d/-u组合使用; - 结构化文本:
sort -t 分隔符 -k 列号 | uniq -f N按列处理。
到此这篇关于Linux 命令uniq经典操作示例的文章就介绍到这了,更多相关Linux 命令uniq内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
