使用awk分析nginx访问日志access.log

awk简介

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。

access.log的输出格式

log_format配置

# log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                   '$status $body_bytes_sent "$http_referer" '
#                   '"$http_user_agent" "$http_x_forwarded_for"';

输出示例

117.136.31.243 - - [13/Mar/2019:14:01:55 +0800] "GET /api/common/getOrganizationsByParentId/1002 HTTP/1.1" 200 6152 "https://servicewechat.com/wx3ac9a9b999fe3552/20/page-frame.html" "Mozilla/5.0 (Linux; Android 5.1; OPPO A37m Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 MicroMessenger/7.0.3.1400(0x2700033B) Process/appbrand0 NetType/4G Language/zh_CN" "-"

常用命令

1、IP统计相关

统计IP访问量

awk '{print $1}' access.log | sort -n | uniq | wc -l

查看某一时间段的IP访问量(2019年3月14日16-17点)

grep "14/Mar/2019:1[6-7]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l

查看访问最频繁的前100个IP

awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100

查看访问100次以上的IP

awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

查询某个IP的访问的请求列表,按请求的访问次数降序

grep '112.97.250.255' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100

2、请求访问统计

总请求数

wc -l  access.log |awk '{print $1}'

查看访问最频繁的100个请求

awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100

查看访问最频繁的100个请求,并排除js文件

grep -v ".php"  access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100

查看访问次数超过100次的请求

cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

查看最近1000条记录,访问量最高的请求

tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

3、单位时间内请求量统计

按每秒统计请求数,显示top100的时间点

awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

按每分钟统计请求数,显示top100的时间点

awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

按每小时统计请求数,显示top100的时间点

awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

4、性能分析

需要在nginx.conf log_format中最后一个字段加入$request_time

列出传输时间超过 3 秒的页面,显示前20条

cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条

cat access.log|awk '($NF > 1 &&  $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100