Shell脚本-uniq工具
一、前言
在 Linux/Unix 系统中,uniq 是一个非常实用的文本处理命令,用于对重复的行进行统计、去重和筛选。它通常与 sort 搭配使用,以实现高效的文本数据清洗与统计分析。
无论是做日志分析、访问频率统计,还是编写自动化脚本,uniq 都是一个不可或缺的工具。
本文将带你全面了解 uniq 工具的使用方式,包括:
✅ uniq 的基本语法与常用参数
✅ 如何统计重复行、去重输出、查找唯一行
✅ uniq 在 Shell 脚本中的实战应用
✅ 与其他文本处理命令的联合使用
✅ 实际开发中的常见问题与优化建议
并通过完整的代码示例帮助你快速上手并熟练掌握 uniq 的各种高级用法。
二、什么是 uniq?
uniq是一个用于 过滤或报告重复行 的命令行工具。它默认只会比较 相邻的行,因此常与sort结合使用。
✅ 典型用途包括:
| 场景 | 示例 |
|---|---|
| 日志分析 | 提取唯一的 IP 地址 |
| 数据统计 | 统计某字段出现次数 |
| 自动化脚本 | 快速去重输出结果 |
| 访问监控 | 查找高频访问用户 |
| 文件清理 | 去除重复行 |
三、uniq 基础语法
uniq [选项] [输入文件] [输出文件]✅ 常用选项说明:
| 参数 | 描述 |
|---|---|
-c | 显示每行出现的次数 |
-d | 只显示重复的行(每组只输出一次) |
-u | 只显示唯一的行 |
-i | 忽略大小写比较 |
-f N | 忽略前 N 个字段再比较 |
-s N | 忽略前 N 个字符再比较 |
-w N | 对每行前 N 个字符进行比较 |
四、uniq 使用示例
✅ 示例1:基础去重输出
echo -e "apple\nbanana\napple\norange" > fruits.txt
sort fruits.txt | uniq输出:
apple
banana
orange⚠️ 注意:
uniq只会合并相邻的相同行,所以必须先排序!
✅ 示例2:统计每行出现次数(-c)
sort fruits.txt | uniq -c输出:
2 apple1 banana1 orange✅ 示例3:只显示重复行(-d)
sort fruits.txt | uniq -d输出:
apple✅ 示例4:只显示唯一行(-u)
sort fruits.txt | uniq -u输出:
banana
orange✅ 示例5:忽略大小写比较(-i)
echo -e "Apple\napple\nBANANA" > mixed.txt
sort -f mixed.txt | uniq -i输出:
Apple
BANANA五、uniq 在 Shell 脚本中的应用
✅ 示例1:统计访问最多的 IP 地址
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -n 10输出类似:
123 192.168.1.100
98 192.168.1.101
...✅ 示例2:提取配置文件中的唯一变量名
grep '=' config.env | cut -d'=' -f1 | sort | uniq输出所有变量名并去重。
✅ 示例3:查找重复的用户名(从 /etc/passwd)
cut -d':' -f1 /etc/passwd | sort | uniq -d输出重复的用户名(如果有的话)。
六、uniq 与其他命令的配合使用
✅ 示例1:统计访问最多的 URL(uniq + cut + sort)
cut -d'"' -f2 access.log | cut -d' ' -f2 | sort | uniq -c | sort -nr | head -n 10输出访问最多的前 10 个 URL。
✅ 示例2:找出未被访问的页面(uniq + grep)
comm -23 <(sort all_pages.txt) <(sort visited_pages.txt)输出在
all_pages.txt中但不在visited_pages.txt中的页面。
✅ 示例3:结合 awk 过滤特定数量的行
sort data.txt | uniq -c | awk '$1 >= 3'输出出现次数大于等于 3 的行。
七、uniq 使用技巧总结
| 技巧 | 说明 |
|---|---|
✅ 总是先排序再使用 uniq | 否则无法识别非连续重复行 |
✅ 使用 -c 统计出现次数 | 适用于访问统计、频率分析 |
✅ 使用 -d 提取重复项 | 快速定位异常数据 |
✅ 使用 -u 提取唯一项 | 快速获取不重复数据 |
✅ 使用 -i 忽略大小写 | 更灵活匹配关键词 |
✅ 结合 awk 过滤特定频率的数据 | 实现复杂逻辑 |
✅ 使用 comm 找出差异 | 对比两个文件内容 |
八、uniq 实战案例汇总
✅ 案例1:从 /etc/passwd 提取唯一用户名
cut -d':' -f1 /etc/passwd | sort | uniq✅ 案例2:统计访问最多的 IP 并排序
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -n 10✅ 案例3:找出两个文件的交集
sort file1.txt file2.txt | uniq -d九、常见问题与解决方法
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 无法识别非连续重复行 | 未使用 sort 排序 | 添加 sort 再调用 uniq |
| 去重无效 | 使用了错误参数 | 检查是否使用了 -d 或 -u |
| 输出乱码 | 编码不一致 | 使用 iconv 或设置 LANG=C |
| 忽略字段错误 | 参数 -f 设置不当 | 检查字段索引是否正确 |
| 统计结果异常 | 输入数据格式混乱 | 使用 tr 或 awk 预处理 |
十、总结对比表:uniq 常用参数一览
| 参数 | 功能 |
|---|---|
-c | 显示每行出现次数 |
-d | 只显示重复行 |
-u | 只显示唯一行 |
-i | 忽略大小写 |
-f | 忽略前 N 个字段 |
-s | 忽略前 N 个字符 |
-w | 对每行前 N 字符进行比较 |
十一、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!
