uniq 是 Linux 中用于去除相邻重复行的命令。它通常与 sort 命令配合使用,因为 uniq 只能去除相邻的重复行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ➜ uniq --help 用法: uniq [选项]... [输入文件 [输出文件]] 从输入文件(或标准输入)中过滤相邻的匹配行,写入输出文件(或标准输出)。
不附加任何选项时,将去除相邻的重复行。
-c, --count 在每行前显示该行重复出现的次数 -d, --repeated 只输出重复的行 -D, --all-repeated 输出所有重复的行 -f, --skip-fields=N 忽略前N个字段 -i, --ignore-case 忽略大小写 -s, --skip-chars=N 忽略前N个字符 -u, --unique 只输出不重复的行 -w, --check-chars=N 只比较每行的前N个字符 -z, --zero-terminated 行终止符为NUL而不是换行符 --help 显示此帮助信息并退出 --version 输出版本信息并退出
|
基本语法
如果不指定文件,从标准输入读取,输出到标准输出。
常用选项
| 选项 |
说明 |
-c, --count |
在每行前显示重复次数 |
-d, --repeated |
只显示重复的行 |
-D, --all-repeated |
显示所有重复的行 |
-u, --unique |
只显示不重复的行 |
-i, --ignore-case |
忽略大小写 |
-f, --skip-fields=N |
忽略前 N 个字段 |
-s, --skip-chars=N |
忽略前 N 个字符 |
-w, --check-chars=N |
只比较前 N 个字符 |
-z, --zero-terminated |
使用 NUL 作为行终止符 |
基本使用
去除重复行
1 2 3 4 5 6
| ➜ uniq file.txt
➜ sort file.txt | uniq
|
统计重复次数
1 2 3 4 5
| ➜ uniq -c file.txt 3 apple 2 banana 1 cherry
|
只显示重复的行
1 2 3 4 5
| ➜ uniq -d file.txt
➜ uniq -D file.txt
|
只显示不重复的行
忽略大小写
实际应用场景
统计词频
1 2 3 4 5
| ➜ cat file.txt | tr ' ' '\n' | sort | uniq -c | sort -rn
➜ awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
|
查找重复内容
1 2 3 4 5
| ➜ sort file.txt | uniq -d
➜ ls | sort | uniq -d
|
去重处理
1 2 3 4 5
| ➜ sort file.txt | uniq > unique.txt
➜ awk '{print $1}' access.log | sort -u
|
与其他命令组合
1 2 3 4 5 6 7 8
| ➜ grep "ERROR" log.txt | awk '{print $5}' | sort | uniq -c
➜ ps aux | awk '{print $11}' | sort | uniq -d
➜ cut -d: -f1 /etc/passwd | sort | uniq | wc -l
|
忽略字段比较
1 2 3 4 5 6 7 8
| ➜ uniq -f 2 file.txt
➜ uniq -s 10 file.txt
➜ uniq -w 5 file.txt
|
注意事项
- 相邻重复:uniq 只能去除相邻的重复行,不相邻的重复行需要先排序
- 排序配合:通常与 sort 命令配合使用:
sort file.txt | uniq
- 字段分隔:默认使用空格和制表符作为字段分隔符
- 性能:对于大文件,先排序再去重可能较慢
参考文献