2015-04-01 84 views
1

我试图删除正在写入日志的重复文本,同时不断监视它。如何在Unix中使用实时监控(tail -f),剪切,排序和uniq?

唯一的问题是,这个特定的日志是时间戳,所以在可以确定相同的文本是否连续写入两次或三次之前,必须剪切时间戳。

我不是Unix专家,但这是我的尝试:

tail -f log.txt | cut -c 28- | sort | uniq

终端出现意外的行为,和只是挂起。而以下两种命令的工作,对自己的:

tail -f log.txt | cut -c 28-

tail -f log.txt | uniq

理想情况下,我想筛选出不相邻的文本输入,也就是我想也可以使用sort,但目前我无法使用tail上的-f标志。

+2

'sort'不会退出,直到它接收到来自其输入的文件结尾,但是您的输入是'tail -f',直到日志文件实际关闭时才会发送文件结束。如果您希望在日志完成之前退出,则不能在上述管道中包含'sort'。 – dg99 2015-04-01 22:31:38

回答

3

在结束之前,您无法获得文本流的排序输出,因为下一个要进入的项目可能会属于您迄今为止所见的第一个项目。这使得管线的sort | unique部分对您的情况没有用处。

尽管可能通过一些更复杂的shell脚本过滤掉重复项,但您可能会发现使用其他语言编写脚本更容易。许多脚本语言都有高效的set数据结构,可以快速检查以前是否看到过某个项目。这是一个极其普通的脚本,应该做使用Python 3工作:

#!/usr/bin/env python3 

import sys 

seen = set() 
for line in sys.stdin: 
    if line not in seen: 
     sys.stdout.write(line) 
     seen.add(line) 

对这个缺点的方法是,该过滤脚本将使用更多的内存比uniq呢,因为它必须记住每一个独特的路线也有过之前。所以,如果您的管道在一次运行中可能会看到很多不同的线路,这可能不是一个合适的解决方案。