Shell分析服务器日志

网站跑在阿里云的ECS上面,分析分析网站服务器日志,看看网站的访问量。
本文是查看nginx的访问日志
1 查看有多少个IP访问

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

2 查看某一个页面被访问的次数

]# grep "/wealth/index.php" access.log | wc -l

3 查看每一个IP访问了多少个页面

]# awk '{++S[$1]} END {for (a in S) print a,S[a]}' access.log > log.txt

]# sort -n -t '' -k 2 log.txt

4 将每个IP访问的页面数进行从小到大的排序

]# awk '{++S[$1]} END {for (a in S) print S[a],a}' access.log  | sort -n

5 查看某一个IP访问了哪些页面

]# grep ^120.229.161.198  access.log  | awk '{print $1,$7}'

6 去掉搜索引擎统计的页面

]# awk '{print $12,$1}' access.log  | grep ^\"Mozilla | awk '{print $2}' | sort | uniq | wc -l

7 查看2019年5月10日15时,这一个小时内有多少IP访问

]# awk '{print $4,$1}' access.log  | grep 10/May/2019:15 | awk '{print $2}' | sort | uniq | wc -l

8 查看访问前十个IP地址

]# awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
或
]# cat access.log  | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
uniq -c : 分组统计并把统计数放在最前面

]# cat access.log  | awk '{counts[$(11)]+=1}; END {for(url in counts) print counts [url],url}'

9 访问次数最多的10个文件或页面

]# cat access.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -10

10 访问子域名访问次数,依据referer来计算,稍有不准

]# cat access.log | awk '{print $11}' | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -rn | head -10

11 列出传输大小最大的几个文件

]# cat access.log  | awk '($7~/\.php/){print $10 " " $1 " " $4 " " $7 }' | sort -nr |head -10

12 列出输出大于200000byte(约200kb)的页面以及对应页面发生次数

]# cat access.log  | awk '($10 > 200000 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -10

13 如果日志最后一列记录的是页面文件传输时间,则有列出客户端最耗时的页面

]# cat access.log  | awk '($7~/\.php/){print $NF "" $1 "" $4 "" $7}' | sort -nr | head -10

14 列出最耗时的页面(超过60秒的),以及对应页面发生的次数

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

15 列出传输时间超过30秒的文件

]# cat access.log  | awk '($NF > 30){print $7}' | sort -n | uniq -c |sort -nr | head -10

16 列出当前服务器每一进程运行的数量,倒序排序

]# ps -ef | awk -F ' ' '{print $8 " " $9}' | sort | uniq -c | sort -nr | head -20

17 查看apache当前并发访问数
对比httpd.conf中MaxClients的数字差距多少

]# netstat -an | grep ESTABLISHED | wc -l

18 可以使用如下参数查看数据

]# ps -ef | grep httpd | wc -l

统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器.
表示Apache能够处理n个并发请求,这个值Apache可根据负载情况自动调整

]# netstat -nat | grep -i "80" | wc -l

netstat -an 会打印系统当前网络链接状态,而grep -i “80” 是用来提取与80端口有关的连接的,
wc -l 进行统计连接数
最终返回的数字就是当前所有80端口的请求总数

]# netstat -na | grep ESTABLISHED | wc -l

netstat -an 会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立链接的信息
再wc -l 统计
最后返回的数字就是当前所有80端口已经建立的总数

]# netstat -na | grep ESTABLISHED | wc

可查看所有建立链接的详细记录

19 输出每个ip的连接数,以及总的各个状态的连接数

]# netstat -n | awk '/^tcp/ {n=split($ (NF-1),array,":");if(n<2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){print("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'
%-20s %s

  49
TOTAL_IP             1
CLOSE_WAIT           1
ESTABLISHED          16
FIN_WAIT2            4
TIME_WAIT            28
TOTAL_LINK           49

20 其他
分析日志文件下,20195月10日访问页面最高的前20个URL并排序

]# cat access.log  | grep '10/May/2019' | awk '{print $11}' | sort | uniq -c | sort -nr | head -10

查询受访问页面的URL地址中,含有www.aaa.com网址的ip地址

]# cat access.log  | awk '($11~/\www.aaa.com/){print $1}' | sort | uniq -c | sort -nr | head -10

获取访问最高的10个IP地址,同时也可以按时间来查询

]# cat access.log  | awk '{print $1}' |sort | uniq -c | sort -nr | head -10

时间段查询日志时间段的情况

]# cat access.log  | egrep '01/May/2019|10/May/2019' | awk '{print $1}' |sort | uniq -c | sort -nr | head -10

分析2019-05-01到2019-05-10访问""/index.php?g=Member&m=Public&a=sendValidCode"" 的IP倒序排序
]# cat access.log  | egrep '01/May/2019|10/May/2019' | awk '{if($7 == "/index.php?g=Member&m=Public&a=sendValidCode") print $1,$7}' | sort | uniq -c | sort -nr

$7~/\.php/ $7里面包含.php的就输出,本句的意思是最耗时的是个PHP页面
]# cat access.log  |awk '($7~/\.php/){print $NF "" $1 "" $4 "" $7}' | sort -nr | head -10

统计网站访问流量(G)

]# cat access.log  | awk '{sum+=$10} END {print sun/2014/1024/1024}'

统计404的连接

]# awk '($9 ~/404/)' access.log  | awk '{print $9 ,$7}' | sort

统计http status

]# cat access.log  | awk '{counts[$(9)]+=1};END {for(code in counts) print code,counts[code]}'

]# cat access.log  | awk '{print $9}' | sort | uniq -c | sort -rn

每秒并发

]# watch "awk '{if($9~/200|30|404/)COUNT[$4]++}END{for (a in COUNT) print a,COUNT[a]}' access.log | sort -k 2 -nr | head -n10"

带宽统计

]# cat access.log  | awk '{if($7~/GET/) count++} END{print "client_request="count} '
]# cat access.log | awk '{BYTE+=$11}END {print "client_kbyte_out="BYTE/1024"KB"}'

找出某天访问次数最多的10个IP

]# cat access.log  | grep "10/May/2019" | awk '{print $3}' | sort | uniq -c | sort -nr | head -10

当天IP连接数最高的IP都在干什么

]# cat access.log | grep "80.211.113.47" | awk '{print $8}' |sort | uniq -c | sort -nr | head -n 10

小时单位里ip连接数最多的10个时段

]# awk -vFS="[:]" '{gsub("-.*","",$1);num[$2""$1]++}END{for(i in num)print i,num[i]}' access.log  | sort -n -k 3 -r | head -10

找出访问次数最多的几分钟

]# awk '{print $1}' access.log  | grep "10/May/2019" | cut -c 14-18 | sort | uniq -c | sort -nr | head
取5分钟日志
if [ $DATE_MINUTE != $DATE_END_MINUTE ] ;then
#判断开始时间戳与结束时间戳是否相等

START_LINE=sed -n "/$DATE_MINUTE/=" $APACHE_LOG| head -n1
#如果不相等,则取出开始时间戳的行号,与结束时间戳的行号

查看tcp的连接状态

]# netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn

]# netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'

]# netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'

]# netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k, "\t",arr[k]}'

]# netstat -n | awk '/^tcp/ {print $NF}' | sort | uniq -c | sort -rn

]# netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c |awk '/ip:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -n

]# netstat -ant | awk '/:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' | sort -rn | head -n 10

查找请求数前20个IP(常用于查找攻击来源)

]# netstat -antulp | grep 80   | grep tcp | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -10

]# netstat -ant | awk '/:80/{split ($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' | sort -rn | head -10

用tcpdump抓包,查看80端口的访问,看谁最高

]# tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{pritn $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -10

查找较多time_wait连接

]# netstat -n | grep TIME_WAIT| awk '{print $5}' | sort | uniq -c | sort -rn | head -10

查找较多的SYN连接

]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

根据端口列出进程

]# netstat -antulp | grep 80 | awk '{print $7}' | cut -d/ -f1

查看连接数和当前的连接数

]# netstat -antulp | grep $ip:80 | wc -l
]# netstat -antulp | grep $ip:80 | grep EST | wc -l

查看IP访问次数

]# netstat -antulp | grep ":80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -n

Linux命令分析当前的连接状况

]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

]# watch "netstat -n | awk '/^tcp/ {++S[\$NF]} END {for(a in S) print a, S[a]}'"
# 通过watch可以一直监控

LAST_ACK 5   #关闭一个TCP连接需要从两个方向上分别进行关闭,双方都是通过发送FIN来表示单方向数据的关闭,当通信双方发送了最后一个FIN的时候,发送方此时处于LAST_ACK状态,当发送方收到对方的确认(Fin的Ack确认)后才真正关闭整个TCP连接;
SYN_RECV 30       # 表示正在等待处理的请求数;
ESTABLISHED 1597  # 表示正常数据传输状态; 
FIN_WAIT1 51      # 表示server端主动要求关闭tcp连接; 
FIN_WAIT2 504     # 表示客户端中断连接; 
TIME_WAIT 1057    # 表示处理完毕,等待超时结束的请求数;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值