我经常需要对网站进行 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