gpt4 book ai didi

awk - 通过 awk 获得三个最高的网站点击率

转载 作者:行者123 更新时间:2023-12-01 09:12:37 24 4
gpt4 key购买 nike

所以我正在尝试制作一个 awk 脚本,该脚本按最高三个的顺序确定最多的命中。我这样做是基于一个看起来像的 apache 网络日志

192.168.198.92 - - [22/Dec/2002:23:08:37 -0400] "GET    / HTTP/1.1" 200 6394 www.yahoo.com    "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1...)" "-"
192.168.198.92 - - [22/Dec/2002:23:08:38 -0400] "GET /images/logo.gif HTTP/1.1" 200 807 www.yahoo.com "http://www.some.com/" "Mozilla/4.0 (compatible; MSIE 6...)" "-"
192.168.72.177 - - [22/Dec/2002:23:32:14 -0400] "GET /news/sports.html HTTP/1.1" 200 3500 www.yahoo.com "http://www.some.com/" "Mozilla/4.0 (compatible; MSIE ...)" "-"
192.168.72.177 - - [22/Dec/2002:23:32:14 -0400] "GET /favicon.ico HTTP/1.1" 404 1997 www.yahoo.com "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3)..." "-"
192.168.72.177 - - [22/Dec/2002:23:32:15 -0400] "GET /style.css HTTP/1.1" 200 4138 www.yahoo.com "http://www.yahoo.com/index.html" "Mozilla/5.0 (Windows..." "-"
192.168.72.177 - - [22/Dec/2002:23:32:16 -0400] "GET /js/ads.js HTTP/1.1" 200 10229 www.yahoo.com "http://www.search.com/index.html" "Mozilla/5.0 (Windows..." "-"
192.168.72.177 - - [22/Dec/2002:23:32:19 -0400] "GET /search.php HTTP/1.1" 400 1997 www.yahoo.com "-" "Mozilla/4.0 JJohnJoJJJJJoJJoJJJJJoJJohJJJJJJJJJJJJohnJohJoJoJJJoJJ

为此,我这样做:

$1 ~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ {
hitCounter[$1]++
notIndexed=1
for(i in ips) {
if (i==$1) { notIndexed=0 }
}
if(notIndexed==1) {
ips[indexx]=$1
indexx++
}
}

此行检测一个 IP,然后在由 IP 索引的“hitCounter”数组中增加它的命中计数。之后我检查 ips 列表,“ips”,看看命中的 IP 是否已经在那里。如果不是,则将 IP 添加到“ips”数组并且索引计数增加 1。理论上,通过这样做,“ips”中的每个索引都应该与“hitCounter”中的索引相关联。我终于……

END {

indexxx=0
for (i in hitCounter) {
if (i>hitCounter[firstIP])
firstIP=ips[indexxx]
else if (i>hitCounter[secondIP])
secondIP=ips[indexxx]
else
thirdIP=ips[indexxx]

indexxx++
}

}

我在这里检查“hitCounter”中的 IP 命中计数,将它们与三个高命中变量中的命中进行比较,如果 IP 命中大于三个高命中变量内容之一,我设置它到当前 IP。

这似乎对我有用,我应该得到“192.168.72.177 192.168.198.92”作为输出,但我却得到“192.168.198.92 192.168.198.92”。

为什么?

编辑:抱歉,这就是我打印最终结果的方式,该结果紧接在“hitCounter”foreach 循环之后...

print "The most hits were from "firstIP" "secondIP" "thirdIP

最佳答案

我不会每次都搜索 IP 以查看它是否存在于 IP 地址列表中,而是这样做:

$1 ~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ {
hitCounter[$1]++
}


END {

for (ip in hitCounter) {
if (hitCounter[ip] > hitCounter[firstIP])
thirdIP = secondIP
secondIP = thirdIP
firstIP = ip
else if (hitCounter[ip] > hitCounter[secondIP])
thirdIP = secondIP
secondIP = ip
else
thirdIP = ip

}

}

我认为您的部分困惑是认为 ifor (i in hitCounter) 中的值而不是键。

关于awk - 通过 awk 获得三个最高的网站点击率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10463499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com