分析日志不用愁,shell命令来解决
自己的小网站跑在阿里云的ECS上面,偶尔也去分析分析自己网站服务器日志,看看网站的访问量。看看有没有黑阔搞破坏;于是收集整理一些服务器日志分析命令;;;
以Nginx 为例
1、查看有多少IP地址访问
awk '{print $1}' access.log | sort | uniq | wc -l
awk '{print $1}'
文本处理,输出第一段(IP地址)access.log 处理的日志
sort
对上一段输出结果排序
uniq
去重
wc -l
对行数统计
2、查看某一个页面被访问的次数
grep 'index.html' access.log | wc -l
grep 'index.html'
所要检索的页面
wc -l
统计数
3、查看每一个IP访问了多少个页面
awk '{++S[$1]} END {for (a in S) print a,S[a]}' access.log > log.txt
++S[$1] END 数组,将第一段进行统计,字典的方式统计 Key=Value 例如: 某一个有几个 127.0.0.1 10
{for (a in S} 遍历整个数组,a 将遍历 S 整个数组的 Key
print a,S[a] 输出变量中的内容,a Key IP地址, S[a] 字典变量,引用a 输出对应的Value
查看
sort -n -t ' ' -k 2 log.txt
-n 进行排序
-t 指定间隔符
-k 2 针对第二列进行排序
4、将每个页面访问的数量从大到小排序
awk '{++S[$1]} END {for (a in S) print S[a],a}' access.log | sort -n
5、查看某一个IP访问了那些页面
grep '106.12.223.228' access.log | awk '{print $1,$7}' | more
6、去掉搜索引擎统计的页面
awk '{print $12,$1}' access.log | grep ^\'Mozilla | awk '{print $2}' | sort | uniq | wc -l
7、查询某一个时间段有多少IP访问
awk '{print $4,$1}' access.log | grep 16/Aug/2020:14 | awk '{print $2}' | wc -l
8、查看访问前十的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
uniq -c 去重后,显示该字段的重复值为多少
sort -nr 将其进行排序,默认是从小到大,r 拍反序
9、访问次数最多的 10个文件或者页面
awk '{print $11}' access.log | sort | uniq -c | sort -nr | head -10
访问量最大的前20个ip
awk '{print $1}' access.log | sort -nr | uniq -c | sort -nr | head -20
第一次排序是根据 IP地址进行的排序,uniq -c 去重统计之后,还需重新排序
10、通过子域名访问次数,一句 referer 来计算
cat access.log | awk '{print $11}' | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -nr | head -20
11、列出传输大小最大的的几个文件
cat access.log | awk '($7~/\.*/){print $10 " " $1 " " $4 " " $7}' | sort -nr | head -100
12、列出输出大于 200000byte(约200kb)页面以及对应页面发生的次数
cat access.log | awk '($10 > 200000 && $7~/\.*/){print $7}' | sort -n | uniq -c | sort -nr | head -100
13、列出当前服务去每一进程运行的数量
ps -ef | awk -F ' ' '{print $8 " " $9}' | sort | uniq -c | sort -nr | head -20
14、查看Apache 的并发访问数
netstat -an | grep ESTABLISHED | wc -l
15、统计服务进程数
ps -ef|grep nginx |wc -l
grep 检索服务name
16、输出每个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){printf("%-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);}'