🐧 Linux uniq 命令详解

🐧 Linux uniq 命令详解


🎯 学习目标

  1. 掌握 uniq 命令的基本功能和使用方法

  2. 理解 uniqsort 的配合关系,掌握去重、统计重复次数等常见操作

  3. 能够在实际场景中(如日志分析、数据清洗)灵活运用 uniq

  4. 熟悉 uniq 在不同 Linux 发行版(Ubuntu/CentOS/EulerOS)中的行为差异

  5. 掌握 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)对排序的影响上。


⚠️ 注意事项与最佳实践

  1. 永远记得先排序

    sort file.txt | uniq
    

    否则无法正确识别所有重复项。

  2. 结合 cutawkgrep 等命令使用更强大

    示例:提取访问最多的用户:

    awk '{print $3}' access.log | sort | uniq -c | sort -nr | head -n 10
    
  3. 避免破坏原始数据

    sort original.txt | uniq > unique.txt
    
  4. 使用 LC_ALL=C 统一排序规则(防止中文乱码或排序混乱):

    LC_ALL=C sort file.txt | uniq
    
  5. 日志分析常用组合命令

    # 查找最活跃的访问时间(小时)
    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 文本处理中非常实用的工具,尤其在日志分析、数据清洗、自动化脚本开发中扮演着重要角色。虽然功能看似简单,但其与 sortgrepawk 等命令的结合,可以构建出强大的数据分析流水线。

掌握好 uniq 的各种参数和组合用法,将极大提升你在服务器运维、自动化处理、数据分析等方面的能力。


🎯 下一步建议:学习 cutawk 如何提取字段,与 sortuniq 构建完整的日志分析链路。

posted @ 2025-06-23 22:55  红尘过客2022  阅读(101)  评论(0)    收藏  举报