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系统!