当前位置: 首页 > news >正文

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 字符进行比较

十一、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.dtcms.com/a/288657.html

相关文章:

  • 两个路由器通过不同的网段互联
  • 从TPACK到TPACK - AI:人工智能时代教师知识框架的重构与验证
  • EPLAN 电气制图(十): 继电器控制回路绘制(下)放料、放灰
  • 基于单片机的IC卡门禁系统设计
  • 最大子数组和问题-详解Kadane算法
  • 每日一题7.20
  • OSS文件上传(一):简单上传
  • feignClient 调用详细流程
  • Valgrind Memcheck 全解析教程:6个程序说明基础内存错误
  • 判断一个数是否为质数方法
  • VSCode使用Jupyter完整指南配置机器学习环境
  • c#:TCP服务端管理类
  • 正点原子stm32F407学习笔记10——输入捕获实验
  • 2025 年科技革命时刻表:四大关键节点将如何重塑未来?
  • 内网后渗透攻击过程(实验环境)--3、横向攻击
  • SQL 调优第一步:EXPLAIN 关键字全解析
  • 【已解决】GitHub SSH 连接失败解决方案:Permission Denied (publickey) 错误修复指南
  • [Linux]进程 / PID
  • 30天打牢数模基础-决策树讲解
  • Linux入门篇学习——NFS 服务器的搭建和使用和开发板固件烧录
  • Spring Boot 第一天知识汇总
  • 【Java项目安全基石】登录认证实战:Session/Token/JWT用户校验机制深度解析
  • 相似度计算
  • 「Java案例」利用方法求反素数
  • Facebook 开源多季节性时间序列数据预测工具:Prophet 饱和预测 Saturating Forecasts
  • dynamic_cast的实现原理
  • Beamer-LaTeX学习(教程批注版)【6】
  • Elasticsearch 简化指南:GCP Google Compute Engine
  • GPT-4o mini TTS:领先的文本转语音技术
  • 随着GPT-5测试中泄露OpenAI 预计将很快发布 揭秘GPT-5冲击波:OpenAI如何颠覆AI战场,碾压谷歌和Claude?