LOADING...

加载中请稍等...

loading

Linux每日一篇 - 37 - uniq

Linux文本去重神器!掌握uniq命令,轻松处理重复数据,让文本分析更精准!

uniq命令是什么?

uniq命令是Linux中用于过滤和统计文本文件中重复行的工具。它可以删除相邻的重复行,统计重复次数,或只显示唯一行或重复行。uniq通常与sort命令结合使用以处理非相邻的重复行。

基本用法

# 删除相邻的重复行
uniq filename

# 显示每行重复的次数
uniq -c filename

# 只显示重复的行
uniq -d filename

# 只显示唯一的行(不重复的行)
uniq -u filename

# 忽略大小写
uniq -i filename

# 比较时跳过开头的N个字符
uniq -s 5 filename

# 比较时只考虑前N个字符
uniq -w 10 filename

# 指定字段分隔符
uniq -f 1 filename  # 跳过第一个字段

实用技巧

# 与sort命令结合使用(处理所有重复行,不仅仅是相邻行)
sort filename | uniq

# 统计并显示重复次数,按次数排序
sort filename | uniq -c | sort -nr

# 显示重复次数大于N的行
sort filename | uniq -c | awk '$1 > 2 {print $2}'

# 显示只出现一次的行
sort filename | uniq -u

# 显示至少出现一次的重复行
sort filename | uniq -d

# 统计不同内容的数量
sort filename | uniq | wc -l

# 显示重复行的统计信息
sort filename | uniq -c | awk '{print $1 "次: " $2}'

# 按特定字段去重(跳过前N个字段进行比较)
sort -k 3,3 filename | uniq -f 2

# 按特定字符数比较
uniq -w 10 filename  # 只比较前10个字符

# 忽略大小写去重
sort -f filename | uniq -i

常用场景

# 处理访问日志,统计IP访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr

# 从列表中去除重复项
sort userlist.txt | uniq > unique_userlist.txt

# 查找最常访问的页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10

# 统计错误日志中的错误类型
grep "ERROR" error.log | awk '{print $5}' | sort | uniq -c

# 查找只出现一次的单词
tr ' ' '\n' text.txt | sort | uniq -u

# 统计进程类型
ps aux | awk '{print $11}' | sort | uniq -c

# 检查重复的邮件地址
sort emails.txt | uniq -d  # 显示重复的邮箱

# 统计系统中不同用户的进程数
ps -eo user | sort | uniq -c

# 查找网络连接中的重复IP
netstat -an | awk '{print $5}' | sort | uniq -c

# 检查配置文件中的重复配置项
grep "^key=" config.conf | sort | uniq -d

高级用法

# 结合其他命令进行复杂的数据分析
# 统计访问量最高的10个IP地址
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

# 查找重复文件(基于文件名)
ls -la | awk '{print $9}' | sort | uniq -d

# 分析系统日志中的错误模式
grep -i error system.log | awk '{print $4 ":" $5 ":" $6}' | sort | uniq -c

# 处理CSV文件的重复项
sort -t ',' -k 2,2 data.csv | uniq -w 20  # 按第2列前20个字符比较

# 检查端口占用情况
netstat -tuln | awk '{print $4}' | sort | uniq -c | grep -v "1 "

# 分析用户行为
awk '{print $1, $7}' access.log | sort | uniq -c | sort -nr

# 创建数据摘要
sort data.txt | uniq -c | awk '{if($1>1) print "重复: " $2; else print "唯一: " $2}'

# 按不同条件过滤
# 忽略前导空格
sort -k 1.1,1.10 data.txt | uniq -s 3  # 跳过前3个字符比较

# 处理多字段数据
sort -t ':' -k 1,1 /etc/passwd | uniq -f 1  # 按用户名去重,忽略其他字段

实际应用示例

# 示例1: 处理学生成绩数据
# 假设文件格式: 姓名 年龄 科目 分数
# 找出重复的记录
sort -k 1,2 grades.txt | uniq -f 2

# 示例2: 分析网站访问日志
# 统计每个页面的访问次数
awk '{print $7}' access.log | sort | uniq -c | sort -nr

# 示例3: 管理用户列表
# 查找重复的用户名
cut -d: -f1 /etc/passwd | sort | uniq -d

# 示例4: 处理邮件列表
# 去除重复邮件地址
grep -iE '[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}' emails.txt | sort | uniq

# 示例5: 检查服务配置
# 找出重复的服务端口配置
grep -E "port [0-9]+" services.conf | awk '{print $2}' | sort | uniq -d

# 示例6: 处理产品列表
# 按产品ID去重
sort -k 1,1 products.txt | uniq

# 示例7: 分析系统进程
# 统计每个用户运行的进程数
ps -eo user | tail -n +2 | sort | uniq -c

与相关命令的配合

# uniq与sort的配合使用说明:
# uniq只删除相邻的重复行,所以通常需要先用sort排序
sort file.txt | uniq  # 这样可以删除所有重复行
# 而直接使用uniq file.txt只能删除相邻的重复行

# uniq与grep的配合:
grep "pattern" file.txt | sort | uniq

# uniq与awk的配合:
awk '{print $1}' file.txt | sort | uniq -c

# uniq与管道的配合:
cat file1.txt file2.txt | sort | uniq > merged_unique.txt

注意事项

# 1. uniq只处理相邻的重复行,因此通常需要先排序
# 2. 默认情况下,uniq区分大小写
# 3. uniq不会修改原文件,结果输出到标准输出
# 4. 使用uniq -c时,计数在每行前面显示
# 5. -f选项跳过字段时,字段以空格或制表符分隔
# 6. -s和-w选项用于字符级比较,需要谨慎使用
# 7. 对于大文件,考虑使用sort -u替代sort | uniq

关于我

全平台同名”汪多多是只猫”,专注分享实用技术教程,让你的IT学习之路更轻松!

关注我,每天一个Linux命令,轻松入门Linux系统!

头像
汪多多是只猫
失业的运维工程师
热爱开源与分享
微信公众号