最常见 IP 地址 bash 脚本的 Apache 访问日志

Posted

技术标签:

【中文标题】最常见 IP 地址 bash 脚本的 Apache 访问日志【英文标题】:Apache access log for the most common IP address bash script 【发布时间】:2014-05-18 18:47:58 【问题描述】:

所以我在 apache 日志文件上运行 bash 脚本,我可以对 IP 地址进行排序并显示最常见的地址,但它显示在页面底部而不是顶部我如何从最高到最低显示它

这是我目前的脚本

cat access_log.txt | awk 'print $1'| uniq -c |sort -n -k 1| tail

在我的 txt 文件中,我有

10.23.234.0
250.40.56.78
8.45.98.250
10.23.234.0
250.40.56.78
8.45.98.250
10.23.234.0
250.40.56.78
10.23.234.0
250.40.56.78
10.23.234.0 
10.23.234.0

输出是

2 8.45.98.250
4 250.40.56.78
6 10.23.234.0

我希望输出是

6 10.23.234.0
4 250.40.56.78
2 8.45.98.250

也希望是打印出旁边的 DNS 名称的最佳方式,例如

66.249.73.234 - - [12/Fegb/2013:12:00:09 +1100] "GET /java/tut/tut.sgml-065.html HTTP/1.1" 200 752 "-" "Mozilla/6.0 (compatible; Googlebot/2.1; +http://www.google.com.html)"  

原来如此

66.249.73.234 - http://www.google.com.html

谢谢

【问题讨论】:

-r 传递给您的排序命令以反转排序顺序。 【参考方案1】:

你可以用这个:

awk 'a[$1]++ END for (i in a) print a[i],i | "sort -rnk1"' access_log.txt
5 10.23.234.0
4 250.40.56.78
2 8.45.98.250
1 10.23.234.0

awk 'a[$1]++ END for (i in a) print a[i],i' access_log.txt | sort -rnk1

r 在排序中是反向的


获取html数据

awk 'split($0,a,"http|[)]");print $1" - http"a[2]' file
66.249.73.234 - http://www.google.com/bot.html

仅针对前两条记录的顶部打印 DNS。

awk 'split($0,b,"http|[)]");a[$1" - http"b[2]]++ END for (i in a) print a[i],i' file | sort -rnk 1 | awk 'NR>2 $0=$1FS$2 1'

【讨论】:

使用标准的awk 可能很难做到。但我添加了一个示例,即 1) 计算所有 ip/dns。 2) 排序。 3) 仅打印前两条记录的 DNS。

以上是关于最常见 IP 地址 bash 脚本的 Apache 访问日志的主要内容,如果未能解决你的问题,请参考以下文章

用于测试多个地址和端口的 Bash 脚本 telnet

在 bash 中检测公共 IP 地址的方法

shell脚本实现批量解析域名IP地址(支持多DNS)

面试题

面试题

shell脚本检测IP地址