awk是一个强悍的文本剖析工具,相对于grep的查找linux日志分析方法,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对文件进行流处理linux日志分析方法linux系统好用吗,每次读取一行。$1就是IP,count[i]++是将IP作为一个链表的下标,但是促使统计这个IP所对应的链表元素自增1.END旁边的句子是复印结果,只执行一次。
也可以拿来找出访问次数最多的ip。
awk '{a[$1] += 1;} END {for (i in a) printf("%d %sn", a[i], i);}' 日志文件 | sort -n | tail -n 10 #用tail显示最后10行
首先用awk统计下来一个列表红旗linux下载,之后用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
查看23:27分,访问api/v1开头的插口
cat access-2020-09-06.log | grep 2020-09-06T23:27|grep /api/v1
cat access-2020-09-06.log | grep 2020-09-06T23:27|grep /api/v1|wc -l //api/vi 开头接口多少行
发觉系统存在的问题
我们可以使用下边的命令行,统计服务器返回的状态码,发觉系统可能存在的问题。
awk '{print $9}' access.log | sort | uniq -c | sort
正常情况下,状态码200或30x应当是出现次数最多的。40x通常表示顾客端访问问题。50x通常表示服务器端问题。
下边是一些常见的状态码:
HTTP合同状态码定义可以参阅:HypertextTransferProtocol--HTTP/1.1
有关状态码的awk命令示例:
awk '{print $8}' access-2020-09-18.log | sort | uniq -c | sort //日志文件中装态码统计
1.查找并显示所有状态码为404的恳求
awk '($9 ~ /404/)' access.log
awk '($8 ~ /404/)' access-2020-09-18.log|head -20
2.统计所有状态码为404的恳求(不带搜索文件的,不能用)
awk '($9 ~ /404/)'
3.查询特定插口,状态码不是200的
awk '($8 !=200)' access-2020-09-18.log|grep "/api/v1/user/updateHeadImg"
awk '($8 =499)' access-2020-09-18.log|grep "/api/v1"|head -n 100000|tail -n 95000 //状态码为499的特定接口,第95000至10万行