过滤掉 tail -f [duplicate] 的重复行

过滤掉 tail -f [duplicate] 的重复行

我经常需要对网站进行 tail -f apache 访问日志来解决问题 - 一件令人烦恼的事情是,任何人加载一个页面一次都可能导致 12 行以上写入日志,因为它们每行都很长在我的终端中换行多行。

tail -f 似乎与 grep 和 awk 的管道配合得很好,我想出了一个非常简单的解决方案,当一个 IP 地址在特定的一秒内发出许多请求时过滤掉重复项(以及将其修剪为我通常使用的特定信息)需要)-

tail -f 日志文件 | awk ' { print $1 " " $4 " " $9}' |独特的

问题是,这行不通。即使我知道应该打印大量行,我也根本没有得到任何输出。

我尝试过一些故障排除,但无法让事情真正发挥作用-

tail -f log.file | awk ' { print $1 " " $4 " " $9}' 

这完全按照我的想法工作,并在发生时打印行(但有许多重复项),如下所示:

12.34.56.78 [10/May/2016:18:42:01 200
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
tail log.file | awk ' { print $1 " " $4  " " $9}' | uniq

这也完全按照我的想法工作,并过滤掉任何重复的行。但对于我的故障排除,我确实需要实时更新tail -f

如何过滤tail -f掉重复的行?

答案1

作为纯 awk 解决方案,请尝试:

tail -f log.file | awk ' $0!=last{ print $1 " " $4 " " $9} {last=$0}'

仅当输入行与前一个输入行不同时,此命令才会打印新的输出行。

作为一个细微的变化,仅当该输出行与前一个输出行不同时,此输出行才会打印新的输出行:

tail -f log.file | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'

例子

让我们尝试一下这个测试文件:

$ cat logfile
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 11
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 19 12
1 2 3 4 5 6 7 8 19 13
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 29

awk 过滤掉重复的输出行:

$ cat logfile | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}' 
1 4 9
1 4 19
1 4 29

相关内容