在bash中用awk或类似的方法确定一些独特的行

我正在使用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 

这并不像托尔的脚本那样紧凑,但是我通常会发现,一旦我写了这样的东西,我想要做更多的线条本身,所以我已经离开了看到的数组(跟踪独特的计数线)在那里。