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、原始访问日志

log

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命令使用方法。

Logo

更多推荐