Unix中统计、去除文件中的重复行(1)


在数据库中,如果表中记录有重复的话,则只需要通过distinct关键字就可以达到去除重复行的目的。那么在Unix操作系统中,是否也有便利的工具能够实现这个需求呢?答案当然是肯定的。为了实现这个需求,我们需要用到sort排序命令和uniq去除重复行命令。

众所周知,在Unix系统维护中,系统工程师经常需要把多个文件合并成一个文件。此时就会遇到一个问题,即将多个文件连接或者合并在一起的时候,可能会产生重复的记录。这是系统工程师不希望看到的。那么该如何消除这些重复的记录呢?熟悉排序命令的读者,一定知道利用sort排序命中一个-u 可选项可以达到删除重复行的目的。但是这个功能并不是很强。如不能够帮助系统工程师找出哪些行是重复的或者统计重复行出现的次数等等。要实现这些复杂的功能,就需要借助于这个uniq去除重复行命令了。

第一步:先对文件中的记录进行排序。

如现在系统工程师将两个文件合并后,产生如下一个文件log.txt。

销售部出现系统备份故障

采购部出现系统备份故障

销售部出现系统备份故障

财务部出现系统备份故障

这是一个系统备份程序出现故障时的提示信息。为了便于管理,系统工程师往往先将一个星期或者半个月的错误记录合并在同一个文件中。然后再把重复的记录去除掉,就可以发现哪些部分的备份出了问题。如果不去掉重复行的话,那么一个个核对过去就会很麻烦。看着一长串错误列表(其实很多都是重复的),也不知道该如何下手。另外统计重复行出现的次数(每个部分系统备份故障程序的次数)也可以帮助系统工程师判断这个错误是不是偶然性的。为此,现在系统工程师主要想实现三个功能。第一是能够统计这个文件中错误信息重复的次数;第二是能够知道哪些故障信息出现了一次以上;第三就是得到一个去除了重复行的文件,以方便工程师分析问题原因并最终解决问题。这三个功能的话利用uniq命令都可以轻松解决。不过需要注意的是,在使用这个去除重复行的命令之前,必须要先对这个记录文件进行排序。其实这个原理跟数据库中的distinct去除重复行的关键字工作原理是类似的。在数据库中采用这个关键字去除重复记录时,数据库会自动对相关的记录进行排序,然后再去除重复行。而现在这个uniq命令自身没有排序的功能。这也是Unix操作系统的一个特点,即每个命令只完成单一的功能。而这个去除重复行的uniq命令对于那些没有经过排序的命令是不起任何作用的。如上面这个日志文件,如果文件中的记录没有排序,那么这个uniq命令就无法去除这个重复的记录或者统计重复记录出现的次数。为此系统工程师要做的第一步,就是对这个文件排序。如可以使用sort log.txt>log1.txt命令,将这个日志文件中的记录进行排序并将排序后的结果保存到一个文件中。

第二步:利用uniq命令去除重复的行。

当某个文件排序完成之后,就可以使用这个uniq命令来去除重复的行了。如使用uniq log1.txt(注意这里使用的是排序后的文件),系统工程师就可以得到如下的结果:

采购部出现系统备份故障

财务部出现系统备份故障

销售部出现系统备份故障

从这个结果中可以看出,系统由四条记录变为了三条,取出了一条重复行的记录。也就是说,这个uniq命令会读取文件中每一行的内容写入到标准输出。如果在读取行的时候,遇到多行重复内容的话,则只输出其中的一行。通过这个工作记录,就可以实现去除重复行的目的。需要注意的是,有时候系统工程师想要将这个处理的结果保存到一个文件中。这个跟其他命令的处理方式不一样。如像ps等命令,想将命令的执行结果保存到一个文件中,则需要采用重定向符号>。但是这个uniq命令则不同。因为这个命令本省就可以带两个文件名作为参数。如uniq 原文件 目标文件。注意这个格式并不是说让操作系统分别对原文件与目标文件都进行去除重复行的动作。而是对原文件进行去除重复行的操作,然后将执行的结果保存到目标文件中。也就是说,此时uniq命令只是对原文件进行处理,并不会对目标文件进行任何去除重复行的操作。换一句话说,uniq命令一次只能够对一个文件进行去除重复行的操作。另外就是需要注意的是,将执行的结果保存到一个文件中不需要用到重定向符号。


相关内容