我正在使用AWK来读取我有的自定义日志文件。 格式是这样的:
[12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.4:8091 HTTP/1.0" 200
现在,我有AWK(来自bash)设置为读取整个日志,分析每一行,并抓住每一行包含“连接”的工作,但是,它并没有帮助我发现独特的客户端。
做到这一点的方法是以某种方式过滤它,以便它分析每行的这一部分:“CONNECT 192.168.2.4:8091 HTTP / 1.0”
如果有一种方法可以抓取日志文件中的所有行,那么将它们全部进行比较,只计算类似的行。 举个例子:
[12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.6:8091 HTTP/2.0" 200 [12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.9:8091 HTTP/2.0" 200 [12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.2:8091 HTTP/2.0" 200 [12:08:00 +0000] 192.168.2.3 98374 "CONNECT 192.168.2.9:8091 HTTP/2.0" 200
在这种情况下,我需要的答案是3,而不是4.因为2行是相同的,所以只有3个独特的行。 我需要的是用AWK自动完成这个任务。
如果任何人都可以伸出一个很棒的手。
你可以让awk计算这样的独特实例:
awk -F\" '/CONNECT/ && !seen[$2] { seen[$2]++ } END { print length(seen) }' logfile
输出:
3
这将从所seen
哈希数组中的包含CONNECT
行中收集第一个双引号string。 当到达input结束时,将seen
的元素的数量。
sed -re 's/.*"([^"]*)".*/\1/' <logfile> |sort |uniq
Awk变体: awk -F'"' {print $2} <logfile> |sort |uniq
将-c
添加到uniq
以获得每个匹配行的计数,或者|wc -l
来获得匹配行的数量。
通过sort |运行日志文件 uniq应该过滤出重复的行,但我会质疑为什么你有这些行在那里。 他们真的是重复的吗?
如果他们是合法的日志条目,并且所有你想要的都是唯一的客户端列表(第二个字段),那么对Thor的脚本进行一个简单的修改就可以得到你想要的结果:
awk ' /CONNECT/ { if (seen[$0] == 0) { clients[$3]++ } seen[$0]++ } END { for (i in clients) { print i } }'
你为哪个样本给出了结果:
192.168.2.3
这并不像托尔的脚本那样紧凑,但是我通常会发现,一旦我写了这样的东西,我想要做更多的线条本身,所以我已经离开了看到的数组(跟踪独特的计数线)在那里。