我正在尝试删除写入日志的重复文本,同时不断监视它。
唯一的问题是此特定日志是带时间戳的,因此在确定相同文本是连续写入两次还是三次之前,必须先删除时间戳。
我不是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}}标记。
答案 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
更多的内存,因为它必须记住它之前看到的每个唯一行。因此,如果您的管道在一次运行中可能会看到许多不同的行,这可能不是一个合适的解决方案。