一、前言
在 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 字符进行比较 |
十一、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!