Linux 的 uniq 命令

uniq 是 Linux 和 Unix 系统中一个非常实用的文本处理命令,用于检测、过滤和报告相邻的重复行 。它通常与 sort 命令结合使用,是 Shell 脚本和日常文本处理中不可或缺的工具。

1. 命令基本语法

uniq [选项] [输入文件] [输出文件]

  • 输入文件:要处理的文件。如果未指定,则从标准输入读取。
  • 输出文件:处理结果输出到的文件。如果未指定,则输出到标准输出。

2. 核心功能与工作原理

uniq 的核心功能是对相邻的重复行进行操作。它逐行读取输入,比较当前行与上一行。如果两行完全相同,则根据选项决定是保留、删除还是计数。

重要前提uniq 默认只处理相邻 的重复行。如果重复行不相邻(例如分散在文件各处),则需要先使用 sort 命令排序,使重复行相邻,再用 uniq 处理。

3. 常用选项详解

3.1 基础去重与显示

  • -c--count:在每行前显示该行重复的次数。
  • -d--repeated:仅输出重复的行(每组重复行只输出一次)。
  • -u--unique:仅输出不重复的行(即文件中只出现一次的行)。

3.2 比较控制

  • -i--ignore-case:忽略大小写差异进行比较。
  • -f N--skip-fields=N:比较时跳过前 N 个字段(字段由空格或制表符分隔)。
  • -s N--skip-chars=N:比较时跳过前 N 个字符。
  • -w N--check-chars=N:只比较每行的前 N 个字符。

4. 实战示例

假设我们有一个日志文件 access.log,内容如下:

bash 复制代码
192.168.1.1 GET /index.html
192.168.1.2 POST /login
192.168.1.1 GET /index.html
192.168.1.3 GET /about
192.168.1.1 GET /index.html
192.168.1.2 POST /login

示例 1:基本去重(需先排序)

bash 复制代码
sort access.log | uniq

输出:

复制代码
192.168.1.1 GET /index.html
192.168.1.2 POST /login
192.168.1.3 GET /about

示例 2:统计每行出现次数

bash 复制代码
sort access.log | uniq -c

输出:

复制代码
      3 192.168.1.1 GET /index.html
      2 192.168.1.2 POST /login
      1 192.168.1.3 GET /about

示例 3:仅显示重复行

bash 复制代码
sort access.log | uniq -d

输出:

复制代码
192.168.1.1 GET /index.html
192.168.1.2 POST /login

示例 4:忽略特定字段进行比较

假设我们只关心 IP 地址,忽略请求方法和路径:

bash 复制代码
sort -k1,1 access.log | uniq -f 1

这里 sort -k1,1 先按第一个字段(IP)排序,然后 uniq -f 1 跳过第一个字段进行比较,最终每个 IP 只保留一行。

5. 经典组合:sort | uniq

由于 uniq 只能处理相邻重复,sort | uniq 成为处理文件中所有重复行的标准流程:

  1. sort:将文件所有行排序,使相同内容的行相邻。
  2. uniq:对排序后的相邻重复行进行去重或统计。

这个组合非常高效,常用于日志分析、数据清洗和列表去重。

6. 注意事项与常见误区

  1. 必须理解"相邻"原则 :直接对未排序文件使用 uniq 可能无法去除所有重复。
  2. 空白行处理 :空行也被视为一行内容,uniq 会对其进行处理。
  3. 字段与字符跳过的区别-f 跳过的是由空格/制表符分隔的字段,-s 跳过的是字符,无论其是否在字段边界。
  4. 输出重定向 :可以使用 >>> 将结果保存到文件,例如 uniq input.txt > output.txt

7. 总结

uniq 命令虽然简单,但功能强大且灵活。掌握其与 sort 的组合使用,可以高效解决许多文本去重和统计问题。记住它的核心是处理相邻重复行,这是正确使用该命令的关键。

相关推荐
不吃香菜kkk、18 分钟前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
whyutianict_vv34 分钟前
云计算运维培训课程技术栈拆解:从 Linux 网络到 AI 推理的五层能力分层
linux·云计算
狂师39 分钟前
cloudflared,不需要服务器和公网 IP 的免费内网穿透,一条命令上手
服务器·程序员·开源
pt10431 小时前
面向AI的Cisco UCS X-Series设计-2:Cisco UCS AI规格选型
运维·人工智能
元岳数字人小元1 小时前
无惧网络受限:数字人私有化部署打造离线全域服务能力
运维·人工智能·开源·人机交互·交互
Wang's Blog1 小时前
Java 项目实战: 外卖平台-启用禁用员工账号与Long精度丢失修复
java·服务器
xiaoye-duck1 小时前
《Linux 网络编程》深入理解数据链路层:从MAC帧到ARP协议的底层原理详解
linux·网络
2601_962063231 小时前
从使用场景覆盖到品牌长期建设的内容解读
运维
此冬歌咏2 小时前
K8s etcd 备份与恢复实战:误删命名空间后 37 秒恢复,5 个对象 UID 完全一致
运维
渡我白衣2 小时前
HttpRequest与HttpResponse的实现
服务器·数据结构·c++·人工智能·tcp/ip·机器学习·caffe