如何在Unix中使用实时监控(tail -f),cut,sort和uniq?

时间:2015-04-01 21:58:56

标签: sorting unix real-time cut tail

我正在尝试删除写入日志的重复文本,同时不断监视它。

唯一的问题是此特定日志是带时间戳的,因此在确定相同文本是连续写入两次还是三次之前,必须先删除时间戳。

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

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

终端出现异常行为,只是挂起。以下两个命令中的任何一个都可以自行运行:

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

tail -f log.txt | uniq

理想情况下,我想过滤掉不相邻的文字条目,即我希望能够使用sort,但目前我还无法使用-f tail上的{{1}}标记。

1 个答案:

答案 0 :(得分: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更多的内存,因为它必须记住它之前看到的每个唯一行。因此,如果您的管道在一次运行中可能会看到许多不同的行,这可能不是一个合适的解决方案。