1. 命令概述
- 命令名称:
uniq(英文全拼:unique) - 核心功能:去除重复行,报告或忽略重复行
- 主要用途:数据去重、统计重复次数、显示重复行
- 特点:只检查相邻的重复行,通常与
sort命令配合使用
2. 语法格式
uniq [选项] [输入文件 [输出文件]]
3. 常用选项
| 选项 | 说明 |
|---|---|
-c | 在每行前显示重复次数 |
-d | 只显示重复行 |
-u | 只显示不重复行 |
-i | 忽略大小写 |
-f n | 跳过前 n 个字段 |
-s n | 跳过前 n 个字符 |
-w n | 只比较前 n 个字符 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
4. 基本操作
(1) 基本去重
# 去除重复行(只检查相邻行)
uniq file.txt
# 去除重复行并显示重复次数
uniq -c file.txt
# 只显示重复行
uniq -d file.txt
# 只显示不重复行
uniq -u file.txt
# 忽略大小写去重
uniq -i file.txt
(2) 配合sort使用
# 先排序再去重(全局去重)
sort file.txt | uniq
# 排序后统计重复次数
sort file.txt | uniq -c
# 排序后只显示重复行
sort file.txt | uniq -d
# 排序后只显示不重复行
sort file.txt | uniq -u
(3) 字段和字符处理
# 跳过前2个字段进行比较
uniq -f 2 file.txt
# 跳过前5个字符进行比较
uniq -s 5 file.txt
# 只比较前10个字符
uniq -w 10 file.txt
# 组合使用
uniq -f 2 -s 5 file.txt
5. 常用实例详解
(1) 基本去重示例
假设文件 test.txt内容为:
apple
banana
apple
orange
banana
banana
cherry
# 直接去重(只检查相邻行)
uniq test.txt
# 输出:
# apple
# banana
# apple
# orange
# banana
# cherry
# 先排序再去重
sort test.txt | uniq
# 输出:
# apple
# banana
# cherry
# orange
# 统计重复次数
sort test.txt | uniq -c
# 输出:
# 2 apple
# 3 banana
# 1 cherry
# 1 orange
# 只显示重复行
sort test.txt | uniq -d
# 输出:
# apple
# banana
# 只显示不重复行
sort test.txt | uniq -u
# 输出:
# cherry
# orange
(2) 日志分析
# 统计IP访问次数
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr
# 统计HTTP状态码
cut -d' ' -f9 access.log | sort | uniq -c
# 统计URL访问次数
cut -d' ' -f7 access.log | sort | uniq -c | sort -nr | head -10
# 统计用户代理
cut -d' ' -f12- access.log | sort | uniq -c | sort -nr | head -10
(3) 配置文件处理
# 去除配置文件中的重复行
sort config.conf | uniq > config_clean.conf
# 检查重复的配置项
grep -v '^#' config.conf | sort | uniq -d
# 检查唯一的配置项
grep -v '^#' config.conf | sort | uniq -u
# 统计配置项出现次数
grep -v '^#' config.conf | sort | uniq -c
(4) 代码统计
# 统计函数定义
grep 'def ' *.py | sort | uniq -c
# 统计import语句
grep 'import ' *.py | sort | uniq -c
# 统计TODO注释
grep 'TODO' *.py | sort | uniq -c
# 统计错误日志
grep 'ERROR' *.log | sort | uniq -c | sort -nr
6. 实际应用场景
场景一:数据去重
# 去除重复的用户名
sort users.txt | uniq > unique_users.txt
# 去除重复的IP地址
sort ip_list.txt | uniq > unique_ips.txt
# 去除重复的邮件地址
sort emails.txt | uniq > unique_emails.txt
# 去除重复的文件路径
find /path -type f | sort | uniq > unique_files.txt
场景二:数据统计
# 统计单词出现频率
cat document.txt | tr ' ' '\n' | sort | uniq -c | sort -nr
# 统计字符出现频率
cat document.txt | fold -w1 | sort | uniq -c | sort -nr
# 统计行出现频率
sort file.txt | uniq -c | sort -nr
# 统计文件类型
find /path -type f -name "*.*" | awk -F. '{print $NF}' | sort | uniq -c
场景三:系统监控
# 统计进程数量
ps aux | awk '{print $11}' | sort | uniq -c
# 统计网络连接
netstat -tuln | awk '{print $4}' | sort | uniq -c
# 统计登录用户
who | awk '{print $1}' | sort | uniq -c
# 统计磁盘使用情况
df -h | awk '{print $1}' | sort | uniq -c
场景四:日志分析
# 分析错误日志
grep 'ERROR' app.log | sort | uniq -c | sort -nr
# 分析警告日志
grep 'WARN' app.log | sort | uniq -c | sort -nr
# 分析访问日志
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -10
# 分析响应时间
awk '{print $NF}' access.log | sort -n | uniq -c
7. 与其他命令的区别
| 命令 | 特点 | 适用场景 |
|---|---|---|
uniq | 去除重复行,只检查相邻行 | 数据去重、统计重复次数 |
sort | 对文本行进行排序 | 数据排序、去重准备 |
awk | 文本处理工具,支持字段处理 | 复杂文本处理、报表生成 |
grep | 文本搜索工具 | 模式匹配、搜索 |
cut | 按列提取文本 | 提取指定字段 |
8. 注意事项
- 相邻行检查:
uniq只检查相邻的重复行,通常需要先使用sort排序 - 字段分隔符:默认使用空格分隔字段,使用
-f选项跳过字段 - 字符处理:使用
-s和-w选项控制字符比较 - 大小写敏感:默认区分大小写,使用
-i选项忽略大小写 - 输出控制:可以指定输出文件,否则输出到标准输出
9. 常见问题解决
(1) 去重不彻底
# 错误:直接去重,只检查相邻行
uniq file.txt
# 正确:先排序再去重
sort file.txt | uniq
# 或者使用其他工具
awk '!seen[$0]++' file.txt
(2) 字段分隔问题
# 指定字段分隔符
sort -t: file.txt | uniq -f 2
# 或者使用awk预处理
awk -F: '{print $2}' file.txt | sort | uniq
# 指定字符位置
sort file.txt | uniq -s 5
# 指定比较字符数
sort file.txt | uniq -w 10
(3) 大文件处理
# 分块处理大文件
split -l 10000 largefile.txt chunk_
for chunk in chunk_*; do
sort "$chunk" | uniq >> unique.txt
done
sort unique.txt | uniq > final_unique.txt
# 或者使用其他工具
awk '!seen[$0]++' largefile.txt > unique.txt
(4) 性能优化
# 使用更精确的字段
cut -d' ' -f1 file.txt | sort | uniq -c
# 使用字符限制
cut -c1-10 file.txt | sort | uniq -c
# 使用临时文件
sort file.txt -o sorted.txt
uniq sorted.txt > unique.txt
# 使用管道
cat file.txt | sort | uniq | wc -l
核心要点总结:
uniq用于去除重复行,只检查相邻的重复行- 常用选项:
-c(统计重复次数)、-d(只显示重复行)、-u(只显示不重复行)、-i(忽略大小写) - 配合sort使用:通常需要先
sort排序,再进行uniq去重 - 实际应用:数据去重、日志分析、配置文件处理、代码统计
- 注意事项:只检查相邻行,默认区分大小写,支持字段和字符处理
uniq命令是Linux系统中最常用的文本处理工具之一,熟练掌握可以大大提高数据处理效率。