uniq 命令从标准输入读取过滤邻近的相同的行,然后写回标准输出,在此过程中 uniq 会将重复的行 merge 合并到第一个结果中,所以 uniq 可以用来排除文件中重复的行。因此 uniq 经常和 sort 合用,先排序,然后使用 uniq 来过滤重复行。

查看 man uniq 得知这个命令是用来显示,或者隐藏重复行的命令,一般情况下使用管道命令组合其他 cat, grep, awk, sort 等等使用。可用来过滤重复行,或者找到文本中重复的行。

基本使用

命令格式:

uniq [OPTION]... [INPUT [OUTPUT]]

uniq 会从标准输入读取数据,过滤相邻的行,并将结果输出到标准输出。如果没有其他选项,重复的行会合并到第一次出现的行上。

uniq 的基本使用如下:

一些常用参数

  • -c 在每一行前打印行出现的次数
  • -d 只打印重复的行,重复的行只打印一次
  • -D 打印出所有重复的行
  • -f 在比较时跳过前 N 个 fields
  • -i 在比较重复行时忽略大小写
  • -s 在比较时忽略前 N 字符
  • -u 只打印唯一的行
  • -w 比较时只比较每一行的前 N 个字符

通常情况下 field 是由空格或者 TABs 分割的。

通常情况下,uniq 会和 sort 搭配使用。

命令返回 0 或者 >0 的数值表示退出,如果为 0 表示运行成功,>0 的数值表示发生错误。

实例

假设有如下四行在文件 cat file.txt 中:

uniq line
repeat line
test line
repeat line

打印重复行的数量

最为常用的 -c 选项,可以打印重复行的数量

sort file.txt | uniq -c
  2 repeat line
  1 test line
  1 uniq line

打印重复的行

使用 -d 打印重复的行,那么不重复的行就不会输出

sort file.txt | uniq -dc
  2 repeat line

仅显示不重复的行

显示不重复的行 -u

sort file.txt | uniq -u
test line
uniq line

跳过行开头字符

可以使用 -s 参数跳过开头 N 个字符

cat /var/log/nginx.log | uniq -s 10