Linux常用命令学习笔记:uniq

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. 注意事项

  1. 相邻行检查uniq只检查相邻的重复行,通常需要先使用 sort排序
  2. 字段分隔符:默认使用空格分隔字段,使用 -f选项跳过字段
  3. 字符处理:使用 -s-w选项控制字符比较
  4. 大小写敏感:默认区分大小写,使用 -i选项忽略大小写
  5. 输出控制:可以指定输出文件,否则输出到标准输出

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系统中最常用的文本处理工具之一,熟练掌握可以大大提高数据处理效率。


作 者:南烛
链 接:https://www.itnotes.top/archives/419
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇