2.11 uniq:忽略文件中的重复行
作用:文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。
用法:uniq [选项]...[输入[输出]]
主要选项如下。
● -c:显示输出中,在每行行首加上本行在文件中出现的次数。它可取代-u和-d选项。
● -d:只显示重复行。
● -u:只显示文件中不重复的各行。
● -n:前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
● +n:前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
● -f n:与-n相同,这里n是字段数。
● -s n:与+n相同,这里n是字符数。
应用实例如下。
首先看一下示例文件:
$ cat happy Happy Birthday to You! Happy Birthday to You! Happy Birthday Dear cjh! Happy Birthday to You!
(1)显示文件happy中不重复的行
# uniq -u happy Happy Birthday Dear cjh! Happy Birthday to You!
(2)显示文件happy中不重复的行,从第2个字段的第2个字符开始做比较
#uniq -u -1 +1 happy
(3)用-c选项从uniq中获取一些统计信息
#sort happy | uniq -dc 3 Happy Birthday to You!
这里uniq命令借助管道命令从标准输入设备读取文件,首先使用sort命令对文件进行排序,然后对排序结果进行操作。
(4)删除文件中重复的行并且输出到一个新文件
#sort happy|uniq-uniqhappy
操作过程如图2-4所示。
图2-4 删除文件中重复的行并且输出到一个新文件
注意 请不要使用uniq或任何其他工具从包含财务或其他重要数据的文件中除去重复行。在这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去会给会计部造成许多困难。
(5)高级应用
就算uniq对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。特别方便的是:使用-f选项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。当查看系统日志时这非常有用。通常,某些项要被复制许多次,这使得查看日志很难。使用简单的uniq无法完成任务,因为每一项都以不同的时间戳记开头。但是如果告诉它跳过所有的时间字段,日志一下子就会变得更加便于管理。试一试uniq -f 3 /var/log/messages看看。还有另一个选项-s,它的功能就像-f一样,但是跳过给定数目的字符。可以一起使用-f和–s,uniq先跳过字段,再跳过字符。如果只想使用一些预先设置的字符进行比较,试试-w选项。