🐧 Linux uniq 命令详解
🐧 Linux uniq 命令详解
🎯 学习目标
-
掌握
uniq命令的基本功能和使用方法 -
理解
uniq与sort的配合关系,掌握去重、统计重复次数等常见操作 -
能够在实际场景中(如日志分析、数据清洗)灵活运用
uniq -
熟悉
uniq在不同 Linux 发行版(Ubuntu/CentOS/EulerOS)中的行为差异 -
掌握
uniq的高级用法,如只输出唯一项、重复项、显示出现次数等
🔑 核心重点(知识点提炼)
| 知识点 | 内容简述 |
|---|---|
uniq 主要用途 |
对文本进行去重处理,常用于日志分析、数据统计 |
| 必须先排序 | uniq 只能识别连续的重复行,因此必须配合 sort 使用 |
| 输出唯一项 | -u 参数仅输出不重复的行 |
| 输出重复项 | -d 参数仅输出重复出现的行 |
| 显示重复次数 | -c 参数显示每行出现的次数 |
| 多平台兼容性 | Ubuntu/CentOS/EulerOS 都支持,参数一致 |
💡 详细讲解(结合案例与注意事项)
✅ 什么是 uniq 命令?
uniq 是 Linux 中用于过滤或统计重复行的命令。它通常与 sort 配合使用,因为 uniq 只能识别连续的重复行。
📌 示例对比:
# 错误方式:未排序直接使用 uniq,无法正确去重
uniq names.txt
# 正确方式:先排序再去重
sort names.txt | uniq
⚠️ 提示:
uniq不会对整篇文档扫描查找所有重复项,它只会比较相邻的行。
🛠️ uniq 常用语法格式
uniq [OPTION]... [INPUT [OUTPUT]]
常用选项说明:
| 选项 | 描述 |
|---|---|
-c |
显示每行出现的次数 |
-d |
仅显示重复的行(每个重复组只显示一次) |
-u |
仅显示唯一的行 |
-i |
忽略大小写进行比较 |
-f N |
跳过前 N 个字段再比较 |
-s N |
跳过前 N 个字符再比较 |
-D |
显示所有重复行(不仅只显示一个代表) |
🧪 实战演练(建议在阿里云 Ubuntu ECS 上练习)
场景一:基本去重(去除连续重复行)
假设你有一个 names.txt 文件内容如下:
Alice
Bob
Bob
Charlie
David
David
David
Eve
执行以下命令:
sort names.txt | uniq > unique_names.txt
✅ 输出结果:
Alice
Bob
Charlie
David
Eve
📌 这是最常见的去重方式。
场景二:统计每行出现的次数(日志分析常用)
假设你有一个 access.log 文件记录了访问 IP:
192.168.1.100
192.168.1.101
192.168.1.100
192.168.1.102
192.168.1.101
192.168.1.101
你想知道每个 IP 出现的次数:
sort access.log | uniq -c
✅ 输出结果:
2 192.168.1.100
3 192.168.1.101
1 192.168.1.102
📌 这是日志分析中最常用的组合之一。
场景三:只输出唯一项(如找出首次访问者)
继续使用上面的 access.log 文件:
sort access.log | uniq -u
✅ 输出结果:
192.168.1.102
📌 表示只有这个 IP 只出现了一次。
场景四:只输出重复项(如找出频繁访问者)
sort access.log | uniq -d
✅ 输出结果:
192.168.1.100
192.168.1.101
📌 表示这两个 IP 至少出现了两次。
场景五:显示所有重复行(不只是第一个)
如果你希望查看所有的重复行(而不是只看代表),可以使用:
sort access.log | uniq -D
✅ 输出结果:
192.168.1.100
192.168.1.100
192.168.1.101
192.168.1.101
192.168.1.101
📌 这种方式适合做进一步分析或导出。
场景六:忽略前 N 个字段或字符进行比较
假设你有如下日志文件 log.txt:
Jan 10:00 user1 accessed
Feb 11:00 user1 accessed
Mar 09:00 user2 accessed
Apr 08:00 user1 accessed
你想按用户名(第3列)去重:
awk '{print $3}' log.txt | sort | uniq -c
或者跳过前两个字段:
uniq -f 2 sorted_log.txt
📌 -f 表示跳过前 N 个字段;-s 表示跳过前 N 个字符。
🔄 不同发行版的差异(Ubuntu vs CentOS vs EulerOS)
| 功能 | Ubuntu (Debian系) | CentOS (Red Hat系) | EulerOS (华为) |
|---|---|---|---|
uniq 是否自带 |
✔️(默认安装) | ✔️ | ✔️ |
--help 输出风格 |
BSD 风格 | GNU 风格 | GNU 风格 |
--version 支持 |
✔️ | ✔️ | ✔️ |
-D 支持 |
✔️(GNU coreutils >= 8.0) | ✔️ | ✔️ |
| 字符/字段跳过支持 | ✔️ | ✔️ | ✔️ |
| 默认 locale 影响 | 可能影响排序结果 | 可通过 LC_ALL=C 控制 |
类似 Red Hat 行为 |
✅ 总结:
uniq命令在主流 Linux 发行版中功能一致,主要差异体现在默认语言环境(locale)对排序的影响上。
⚠️ 注意事项与最佳实践
-
永远记得先排序:
sort file.txt | uniq否则无法正确识别所有重复项。
-
结合
cut、awk、grep等命令使用更强大示例:提取访问最多的用户:
awk '{print $3}' access.log | sort | uniq -c | sort -nr | head -n 10 -
避免破坏原始数据:
sort original.txt | uniq > unique.txt -
使用
LC_ALL=C统一排序规则(防止中文乱码或排序混乱):LC_ALL=C sort file.txt | uniq -
日志分析常用组合命令:
# 查找最活跃的访问时间(小时) awk '{print substr($4,2,2)}' access.log | sort | uniq -c | sort -nr # 查找最频繁访问的 URL awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -n 10
📝 总结
uniq 是 Linux 文本处理中非常实用的工具,尤其在日志分析、数据清洗、自动化脚本开发中扮演着重要角色。虽然功能看似简单,但其与 sort、grep、awk 等命令的结合,可以构建出强大的数据分析流水线。
掌握好 uniq 的各种参数和组合用法,将极大提升你在服务器运维、自动化处理、数据分析等方面的能力。
🎯 下一步建议:学习 cut 和 awk 如何提取字段,与 sort 和 uniq 构建完整的日志分析链路。

浙公网安备 33010602011771号