Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk的用法awk 'BEGIN{ commands } pattern{ commands } END{ commands }'第一步:运行BEGIN{ commands...
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk的用法
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
第一步:运行BEGIN{ commands }语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。
第三步:当读至输入流末尾时,运行END{ commands }语句块。
BEGIN语句块在awk開始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。
END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END语句块中完毕,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。
这三个部分缺少任何一部分都可以。
可用awk来统计固定格式日志里的一些数据,如日志中出现过所有不同的IP
awk ‘{i=$1;count[i]++}END{for(i in count)print(i,count[i])}’ /var/log/httpd/access_log
awk对文件进行流处理,每次读取一行。$1就是IP,count[i]++是将IP作为一个数组的下标,并且使得统计这个IP所对应的数组元素自增1.END后面的语句是打印结果,只执行一次。
也可以用来找出访问次数最多的ip。
awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail -n 10 #用tail显示最后10行
首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个。
以上参数可以略作修改显示更多的数据,比如将tail加上-n参数等,另外日志格式不同命令也可能需要稍作修改。
当前WEB服务器中联接次数最多的ip地址
netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr
查看日志中访问次数最多的前10个IP
cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 | less
查看日志中出现100次以上的IP
cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr | less
查看最近访问量最高的文件
cat access_log | tail -10000 | awk '{print $7}' | sort | uniq -c | sort -nr | less
查看日志中访问超过100次的页面
cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
统计某url,一天的访问次数
cat access_log | grep '12/Aug/2009' | grep '/images/index/e1.gif' | wc | awk '{print $1}'
前五天的访问次数最多的网页
cat access_log | awk '{print $7}' | uniq -c | sort -n -r | head -20
从日志里查看该ip在干嘛
cat access_log | grep 218.66.36.119 | awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less
列出传输时间超过 30 秒的文件
cat access_log | awk '($NF > 30){print $7}' | sort -n | uniq -c | sort -nr | head -20
列出最最耗时的页面(超过60秒的)
cat access_log | awk '($NF > 60 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -100
分析:
以url为例,统计url中出现频率次数前10的url,并按出现次数的降序排序。
linux命令:
cat url.log | sort | uniq -c |sort -n -r -k 1 -t ' ' | awk -F '//' '{print $2}' | head -10
现在来一一分析这些命令组合的含义。
1、原始访问日志
2、排序
cat t1.log | sort
表示对data文件中的内容进行排序。sort命令是对于每一行的内容根据字典序(ASCII码)进行排序,这样可以保证重复的记录时相邻的。
3、合并相邻重复记录,统计重复数
cat t1.log | sort | uniq -c
这里,通过管道(|)将左边部分的命令的输出作为右边部分的输入。uniq -c
表示合并相邻的重复记录,并统计重复数。因为uniq -c
只会合并相邻的记录,所以在使用该命令之前需要先排序。
4、对记录重新排序,需要用到sort命令的 -k 1 、-n、-r 三个命令参数
cat t1.log | sort | uniq -c | sort -k 1 -n -r
经过uniq -c
处理之后的数据格式形如"2 data",第一个字段是数字,表示重复的记录数;第二个字段为记录的内容。我们将对此内容进行排序。sort -k 1表示对于每行的第一个字段进行排序,这里即指代表重复记录数的那个字段。因为sort命令的默认排序是按照ASCII,这就会导致按从大到小进行排序时,数值2会排在数值11的前面,所以需要使用-n 参数指定sort命令按照数值大小进行排序。-r 表示逆序,即按照从大到小的顺序进行排序。
5、使用awk -F命令分隔IP地址,并取数组的第二部分
cat t1.log | sort | uniq -c | sort -k 1 -n -r | awk -F '//' '{print $2}'
经过sort data | uniq -c | sort -k 1 -n -r
处理后的文本是 http://192.168.1.100
这样的格式,我们需要的结果是192.168.1.100
这样的格式,需要去掉http://
这些字段,采用awk
才处理,awk -F '//'
是将http://192.168.1.100
分组成2部分 http://
和 192.168.1.100
,{print $2}
的作用是取数组的第二部分,即192.168.1.100
6、使用head -n命令选取前n行
cat t1.log | sort | uniq -c | sort -k 1 -n -r | awk -F '//' '{print $2}'| head -10
head
命令表示选取文本的前x行。通过head -10
就可以得到排序结果中前十行的内容。
7、上面http://192.168.1.100
这样日志格式只是一个简单的示例,实际中的格式会比较复杂 如:/Get http://192.168.1.100/auth
, 我们可以通过awk -F
或者cut -k
命令来截取url。详情参考awk、cut
命令使用方法。
更多推荐
所有评论(0)