自动统计nginx日志

PV访问量(Page View),即页面访问量,每打开一次页面PV计数+1,刷新页面也是。
高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页面。这里需要强调:同一个人浏览你网站同一个页面,不重复计算pv量,点100次也算1次。说白了,pv就是一个访问者打开了你的几个页面。 IP访问数指独立IP访问数,计算是以一个独立的IP在一个计算时段内访问网站计算为1次IP访问数。在同一个计算时段内不管这个IP访问多少次均计算为1次。计算时段有以1天为一个计算时段,也有以1个小时为一个计算时段。 UV访问数(Unique Visitor)指独立访客访问数,一台电脑终端为一个访客。 在同一个局域网中对互联网访问时对外通常是同一个IP,如果该局域网中有10台终端在同一个计算时段内访问同一个网站,对该网站的独立IP访问数贡献为1,而不是10。而此时UV访问数则为10。

yum install nginx -y  :安装nginx,遇到选项全部自动选yes

vim  /etc/nginx/nginx.conf  :查看nginx的配置文件

nginx默认日志格式

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

$time_local   $4
$request       $7
$status        $9
$body_bytes_sent $10

1.统计2017年9月5日PV量
  

grep '05/Sep/2017' cd.mobiletrain.org.log | wc -l

   grep '05/Sep/2017' cd.mobiletrain.org.log  :过滤 cd.mobiletrain.org.log文件中包含05/Sep/2017的行内容

   wc -l:统计前面内容的换行数

2.统计2017年9月5日 一天内访问量最多的10个IP(top10)

  

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{ for(i in ips){print i,ips[i]}}'|sort -k2 -rn|head -n10
awk '{ ips[$1]++ } END{ for(i in ips){print i,ips[i]}}':使用awk命令 将前面获取到的行的内容,以空格分割后,将第一列的内容保存在数组ips中,索引为第一列的内容,值为最终所有列中包含相同索引的个数,然后使用END将获取到的数组ips打印出来
sort -k2 -rn:将前面的内容以空格分割,按照第二列的内容,以字符大小倒序排列
head -n10:获取前面内容的前10行内容

grep ".*"  yum.log | awk '{ ips[$4]++ } END{ for(i in ips){print i,ips[i]}}'|sort -k2 -rn|head -n10   #过滤yum.log文件中以空格分割,第四列的内容并排序打印前10行内容

3.统计2017年9月5日 访问大于100次的IP

  

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{ for(i in ips){if(ips[i]>100){print i,ips[i]}}}'
awk '{ ips[$1]++ } END{ for(i in ips){if(ips[i]>100){print i,ips[i]}}}':使用awk命令 将前面获取到的行的内容,以空格分割后,将第一列的内容保存在数组ips中,索引为第一列的内容,值为最终所有列中包含相同索引的个数,然后使用END将获取到的数组ips中值大于100的内容打印出来
grep ".*"  yum.log | awk '{ ips[$4]++ } END{ for(i in ips){if(ips[i]>10){print i,ips[i]}}}'   #过滤yum.log文件中以空格分割,第四列的内容的出现的次数(一行有一个算一次)大于10次的内容

4.统计2017年9月5日 访问最多的10个页面($request)

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ urls[$7]++ } END{ for(i in urls){print urls[i],i}}'|sort -k1 -rn |head -n10
awk '{ urls[$7]++ } END{ for(i in urls){print urls[i],i}}':使用awk将前面的内容一行一行读入,每行以空格分割,获取每行第7列的内容保存到数组urls中,数组索引为第7列的内容,索引的值为前面所有行中同一个索引出现的次数,处理完文件的内容后,使用END将处理后得到的数组urls打印出来
sort -k1 -rn :将前面的内容以空格分割,按照第一列的内容,以字符大小倒序排列

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ urls[$7]++ } END{ for(i in urls){print urls[i],i}}'|awk '$2>100'
|awk '$2>100':使用awk获取前面的内容,每行按照空格分割,获取第二行的内容大于100的内容

5.统计2017年9月5日 每个URL访问内容总大小($body_bytes-sent)

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ urls[$7]++;sizes[$7]+=$10} END{ for(i in urls){print urls[i],sizes[i],i}}'|sort -k1 -rn |head -n10
| awk '{ urls[$7]++;sizes[$7]+=$10} END{ for(i in urls){print urls[i],sizes[i],i}}':
使用awk将前面的内容一行一行读入,每行以空格分割,获取每行第7列的内容保存到数组urls中,数组索引为第7列的内容,索引的值为前面所有行中同一个索引出现的次数,
获取每行第7列的内容保存到数组sizes中,数组索引为第7列的内容,索引的值为前面所有行中同一个索引对应的第10列的内容相加的和值,
处理完文件的内容后,使用END将处理后得到的数组urls和数组sizes打印出来

6.统计2017年9月5日 每个IP访问状态码数量($status)

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ip_count[$1" "$9]++} END{ for(i in ip_count){print i,ip_count[i]}}'|sort -k1 -rn |head -n10
awk '{ ip_count[$1" "$9]++} END{ for(i in urls){print i,ip_count[i]}}':
用awk将前面的内容一行一行读入,每行以空格分割,获取每行第1列的内容和第9列内容以及一个空格符号一起保存到数组ip_count中,数组索引为第1列的内容加上一个空格加上第九列的内容,索引的值为前面所有行中同一个索引出现的次数,
处理完文件的内容后,使用END将处理后得到的数组ip_count打印出来
grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ip_count[$1" "$9]++} END{ for(i in ip_count){print i,ip_count[i]}}'|sort -k1 -rn |head 
head :默认获取前10行内容

7.统计2017年9月5日 IP访问状态码为404及出现次数($status)

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{if($9=="404"){ ip_count[$1" "$9]++}} END{ for(i in ip_count){print i,ip_count[i]}}'
awk '{if($9=="404"){ ip_count[$1" "$9]++}} END{ for(i in ip_count){print i,ip_count[i]}}':
用awk将前面的内容,一行一行读入,每行以空格分割,如果第九列的内容等于404,则获取每行第1列的内容和第9列内容以及一个空格符号一起保存到数组ip_count中,数组索引为第1列的内容加上一个空格加上第九列的内容,索引的值为根据前面所有行中统计的同一个索引出现的次数,
处理完文件的内容后,使用END将处理后得到的数组ip_count打印出来

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{if($9=="404"){ ip_count[$1" "$9]++}} END{ for(i in ip_count){print i,ip_count[i]}}'|less

  less:分页查看前面的内容

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{if($9=="404"){ ip_count[$1" "$9]++}} END{ for(i in ip_count){print i,ip_count[i]}}'|sort -k3 -nr|head
sort -k3 -nr:将前面的内容以空格分割,按照第三列的内容,以字符大小倒序排列

8.统计前一分钟的PV量

date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M:%S); awk -v date=$date '$0 ~ date {i++} END{print i}' sz.mobiletrain.org.log

 date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M:%S):使用date命令获取前一分钟的时间,以日/月/年:时:分:秒的形式显示前一分钟的时间,将获取到的时间赋值给变量date

awk -v date=$date '$0 ~ date {i++} END{print i}' sz.mobiletrain.org.log:使用awk命令获取sz.mobiletrain.org.log文件中时间为前一分钟的内容行数

-v date=$date:awk使用-v命令将前面的变量date带入到awk中,赋值给awk中的date变量,供当前的awk命令使用,如果不用-v带入之前的变量date,那么awk不会识别之前的变量date

'$0 ~ date {i++} END{print i}' :匹配sz.mobiletrain.org.log文件中包含date变量内容的行,每匹配到一行,i加1,处理完后,使用END 打印统计的值

$0 ~ date:~匹配的意思,匹配变量的值在文件中的内容,$0:文件名字

date="12:29:20"; awk -v date=$date '$0 ~ date {i++} END{ print i }'  yum.log   #获取yum.log文件中包含"12:29:20"内容的行数

date:获取当前时间

date -d '5 minute':获取5分钟后的时间

date -d '-5 minute':获取5分钟前的时间

date -d '5 minute ago':获取5分钟前的时间

date -d '5 week ago':获取5周前的时间

date -d '5 year ago':获取5年前的时间

date -d '5 year ':获取5年后的时间

date -d '5 day ago ':获取5天前的时间

9.统计2017年9月5日 8:30~9:00 ,访问状态码是404($status)

awk '$4>="[05/Seq/2017:08:30:00" && $4<="[05/Seq/2017:08:30:00" {if($9=="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i,ip_code[i]}}' sz.mobiletrain.org.log

使用awk获取sz.mobiletrain.org.log文件中每行以空格分割,第4列内容大于等于[05/Seq/2017:08:30:00且小于等于[05/Seq/2017:08:30:00的内容,然后再从中获取每一行第九列的内容,如果第九列的内容等于404,则将该行的第一列内容加上空格再加上第九列的内容保存到数组ip_code中,数组索引为第一列内容加上空格再加上第九列的内容,索引的值为相同索引的行数,然后使用END打印出数组ip_code的内容

10.统计2017年9月5日 8:30~9:00 ,各种状态码的数量

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{code[$9]++;total++} END{for(i in code){printf i " ";printf code[i]"	";printf "%.2f%
",code[i]/total*100}}'
awk '{code[$9]++,total++} END{for(i in code){printf i " ";printf code[i]"	";printf "%.2f%
",code[i]/total*100}}':
使用awk以空格分割,获取第9列的内容保存到数组code中,数组的索引为第九列的内容,值为含有相同索引的行数,
每读取一行,变量total加1,
使用END打印数组code的内容,并且计算code[i]占总数的比例,且计算的值保留两位小数
{code[$9]++;total++}:awk中多个变量之间以分号(;)隔开
grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{code[$9]++;total++} END{for(i in code){printf i " ";printf code[i]"	";printf "%.2f",code[i]/total*100;print "%" }}'

print与printf中的区别:printf打印不会换行,每使用一次print,会自动换行,printf不会

grep ".*" yum.log | awk '{code[$4]++;total++} END{for(i in code){printf i" ";printf code[i]"	";printf "%.2f%
",code[i]/total*100 }}'  #获取yum.log文件中以空格分割,统计第四列的内容,并且统计每一项内容占总行数的百分比
grep ".*" yum.log | awk '{code[$4]++;total++} END{for(i in code){printf i" ";printf code[i]"	";printf "%.2f",code[i]/total*100;print "%" }}'

11.使用awk获取sz.mobiletrain.org.log 文件中包含05/Sep/2017内容的内容并打印排序

awk '/05/Seq/2017/{ips[$1]++} END{for(i in ips){print i,ips[i]}}' sz.mobiletrain.org.log  |sort -k2rn
awk '/.*/{code[$4]++;total++} END{for(i in code){printf i" ";printf code[i]"	";printf "%.2f",code[i]/total*100;print "%" }}' yum.log   #使用awk过滤yum.log 文件中内容获取第四列的内容并打印
 
原文地址:https://www.cnblogs.com/jingzaixin/p/12585738.html