在Linux系统中,命令行工具是用户与系统交互的核心方式之一,其中uniq命令虽然功能相对单一,但在处理文本文件重复行时却发挥着不可替代的作用,它通常与sort命令结合使用,能够高效地去除或统计相邻的重复行,为文本处理提供便捷支持,本文将详细介绍uniq命令的语法、选项、使用场景及实际应用案例,帮助读者全面掌握这一实用工具。

uniq命令的基本语法与功能
uniq命令的基本语法结构为uniq [选项] [输入文件 [输出文件]],其核心功能是从输入文件中移除相邻的重复行,并将结果输出到标准输出或指定的输出文件中,需要注意的是,uniq仅对相邻的行进行比较,若要处理文件中所有重复行(无论是否相邻),需先通过sort命令对文件进行排序,这一特性使得uniq在处理已排序文件时效率极高,成为文本处理流水线中的重要一环。
默认情况下,uniq命令会直接去除所有相邻的重复行,仅保留每组的第一次出现内容,对于包含“apple”“banana”“apple”“orange”的文本文件,若文件未排序,uniq处理结果仍为“apple”“banana”“apple”“orange”;若先通过sort排序为“apple”“apple”“banana”“orange”,再执行uniq,则结果为“apple”“banana”“orange”。
uniq命令的核心选项详解
uniq命令提供了多个选项,以增强其处理文本的灵活性,以下是常用选项的功能说明:
| 选项 | 全称 | 功能描述 | 
|---|---|---|
| -c | --count | 在每行行首输出重复次数统计 | 
| -d | --repeated | 仅显示重复出现的行 | 
| -D | --all-repeated[=delimit-method] | 显示所有重复行,可选择用空行等分隔重复组 | 
| -f | --skip-fields=N | 跳过前N个字段进行比较 | 
| -i | --ignore-case | 忽略大小写进行比较 | 
| -s | --skip-chars=N | 跳过前N个字符进行比较 | 
| -u | --unique | 仅显示未重复的行 | 
| -w | --check-chars=N | 仅比较每行的前N个字符 | 
| -z | --zero-terminated | 以空字符而非换行符作为行结束符 | 
统计重复行次数(-c选项)
-c选项是uniq最常用的功能之一,它会在每行行首前添加该行在相邻组中出现的次数,对于已排序的文件fruits.txt为“apple”“apple”“banana”“orange”),执行uniq -c fruits.txt将输出:
    2 apple
    1 banana
    1 orange通过统计结果,可以快速分析文本中各重复行的出现频率。
筛选重复行或唯一行(-d与-u选项)
-d选项用于仅显示重复出现的行,而-u选项则相反,仅显示未重复的行,对文件numbers.txt为“1”“2”“2”“3”“3”“3”)执行uniq -d numbers.txt将输出“2”“3”;执行uniq -u numbers.txt则输出“1”。

按字段或字符比较(-f与-s选项)
当需要基于特定字段或字符位置去重时,-f和-s选项非常实用,对于文件users.txt为“john:25”“alice:30”“john:26”“bob:25”),若需按第一个字段(用户名)去重,可执行sort -t: -k1,1 users.txt | uniq -f 1,其中-t:指定分隔符为冒号,-k1,1表示按第一个字段排序,-f 1表示跳过第一个字段进行比较,最终结果为“alice:30”“bob:25”“john:25”。
忽略大小写比较(-i选项)
若需在不区分大小写的情况下去重,可使用-i选项,文件names.txt包含“Alice”“alice”“Bob”“bob”,执行sort -f names.txt | uniq -i将输出“Alice”“Bob”。
uniq命令的实际应用场景
日志文件分析
在服务器运维中,分析日志文件时经常需要统计错误出现的频率,分析error.log中重复的错误信息,可通过以下命令实现统计:
sort error.log | uniq -c | sort -nr
sort对日志排序,uniq -c统计重复次数,sort -nr按数字降序排列,最终输出最频繁的错误信息。
去除重复的IP地址
在分析访问日志时,若需提取唯一的IP地址列表,可结合sort和uniq实现:
cat access.log | awk '{print $1}' | sort | uniq > unique_ips.txt
该命令提取日志中的第一列(IP地址),排序后通过uniq去重,结果保存至unique_ips.txt。

处理CSV文件的重复行
对于CSV文件,若需根据特定列去重,可使用-f选项跳过无关列。data.csv包含“ID,Name,Age”,需按“ID”列去重:
sort -t, -k1,1 data.csv | uniq -f 1 > deduplicated_data.csv
生成单词频率统计
在文本分析中,统计单词出现频率是常见需求,分析article.txt中的单词频率:
cat article.txt | tr '[:upper:]' '[:lower:]' | tr -s ' ' '\n' | sort | uniq -c | sort -nr
该命令将文本转为小写,按空格分割为单词,排序后统计频率并按降序排列。
uniq命令的注意事项
- 输入文件需先排序:uniq仅处理相邻重复行,若需全局去重,务必先用sort排序。
- 字段与字符跳过的区别:-f选项基于字段分隔符跳过字段,-s选项则基于字符数跳过字符,需根据实际需求选择。
- 输出重定向:若直接使用uniq input.txt > input.txt,可能导致文件内容被清空,建议使用临时文件或tee命令处理。
- 大文件处理:uniq命令逐行处理文件,内存占用低,适合处理大文件,但需确保输入文件已排序以提高效率。
uniq命令作为Linux文本处理工具链中的重要一员,凭借其简洁的功能和高效的性能,在日志分析、数据清洗、文本统计等场景中广泛应用,通过合理组合uniq的选项与其他命令(如sort、awk、grep),用户可以灵活应对各种文本处理需求,掌握uniq命令的核心用法与注意事项,不仅能提升日常工作效率,还能为更复杂的Shell脚本编写奠定基础,在实际应用中,建议结合具体场景反复练习,以充分发挥uniq命令的实用价值。



















