shell除去重复的行——uniq命令

From: http://blog.163.com/redhumor@126/blog/static/1955478420123119218332/

进行排序之后,您会发现有些行是重复的。有时候该重复信息是不需要的,可以将它除去以节省磁盘空间。不必对文本行进行排序,但是您应当记住
uniq
在读取行时会对它们进行比较并将只除去两个或更多的连续行。下面的示例说明了它实际上是如何工作的:

清单 1. 用 uniq 除去重复行


              $ cat happybirthday.txt  Happy Birthday to You!  Happy Birthday to You!  Happy Birthday Dear Tux!  Happy Birthday to You!          $ sort happybirthday.txt   Happy Birthday Dear Tux!  Happy Birthday to You!  Happy Birthday to You!  Happy Birthday to You!          $ sort happybirthday.txt | uniq  Happy Birthday Dear Tux!  Happy Birthday to You!        

警告:请不要使用
uniq
或任何其它工具从包含财务或其它重要数据的文件中除去重复行。在这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去会给会计部造成许多困难。千万别这么干!


有关 uniq 的更多信息

本系列文章介绍了文本实用程序,它对在手册页和信息页找到的信息作了补充。如果您打开新的终端窗口并输入
man uniq

info uniq
,或者打开新的浏览器窗口并查看 位于 gnu.org 的 uniq 手册页,那么就可以了解更多的相关信息。


 

如果您希望您的工作轻松点,比如只显示唯一的或重复的行,那么该怎么办呢?您可以用
-u
(唯一)和
-d
(重复)选项来做到这一点,例如:

清单 2. 使用 -u 和 -d 选项


              $ sort happybirthday.txt | uniq -u  Happy Birthday Dear Tux!          $ sort happybirthday.txt | uniq -d  Happy Birthday to You!        

您还可以用
-c
选项从
uniq
中获取一些统计信息:

清单 3. 使用 -c 选项


              $ sort happybirthday.txt | uniq -uc        1 Happy Birthday Dear Tux!          $ sort happybirthday.txt | uniq -dc        3 Happy Birthday to You!        

就算
uniq
对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。特别方便的是:使用
-f
选项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。当您查看系统日志时这非常有用。通常,某些项要被复制许多次,这使得查看日志很难。使用简单的
uniq
无法完成任务,因为每一项都以不同的时间戳记开头。但是如果您告诉它跳过所有的时间字段,您的日志一下子就会变得更加便于管理。试一试
uniq -f 3 /var/log/messages
,亲眼看看。

还有另一个选项
-s
,它的功能就像
-f
一样,但是跳过给定数目的字符。您可以一起使用
-f

-s

uniq
先跳过字段,再跳过字符。如果您只想使用一些预先设置的字符进行比较,那么该怎么办呢?试试看
-w
选项。


你可能感兴趣的:(Linux_Shell)