samjquan
(霍格沃兹-阿宏)
1
课程价值
大纲
时长
90分钟
学习资料
- 高级Bash脚本编程指南
- LINUX与UNIX SHELL编程指南
- 鸟哥的Linux私房菜
- IBM DeveloperWorks
- 阮一峰的《bash脚本教程》
- Google
awk官方文档, mac下的awk与gawk并不一致,用法上有一定的差异。
定义函数
# 查看命令
type
awk字段枚举
awk 'NR==1{for(i=1;i<=NF;i++) {print i"="$i} }' nginx.log
课间作业
演练数据
把/tmp/nginx.log文件复制到自己的家目录下,用来演练
实战内容
- 日志数据检索
- find_error_log 找出log中的404 500的报错
- find_before 找出500错误时候的上下文 考察grep高级用法
- 日志数据统计
- find_top_10 找出访问量最高的ip 统计分析
- 数据文件修改
- url_summary 找出访问量最高的页面地址 借助于sed的统计分析
find_error_log
编写一个函数 find_error_log()
找出log中的404 500的报错
回复的时候按照这个格式
find_error_log() {
}
url_summary(){
}
find_before
找出500错误时候的上下文,找出500错误的前两行 考察grep高级用法,并把这个参数的描述信息贴上
find_before(){
}
find_top_3
找出访问量最高的ip, 统计分析,取出top3
find_top_3(){
}
url_avg_time
找出 /topics 的平均响应时间,响应时间在倒数第二个字段
url_avg_time(){
#易读性好,易修改
awk '$7=="/topics"' nginx.log | awk '{print $(NF-1)}' | awk '{t+=$1}END{print t/NR }'
#高性能
awk '$7=="/topics"{total+=$(NF-1);count+=1}END{print total/count}' nginx.log
课后作业 url_summary
找出访问量最高的页面地址 借助于sed的统计分析
/topics/16689/replies/124751/edit 把数字替换为 /topics/int/replies/int/edit
/_img/uploads/photo/2018/c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large 变成 /_img/uploads/photo/2018/id.png!large
/topics/9497 改成 /topics/int
其他规则参考如上
输出
url pattern对应的请求数量
取出top 20请求量的url pattern
类似
nnn urlxxx
mmm urlxxx
url_summary(){
}
PPT
https://pdf.ceshiren.com/lg5/2020.12.08-三剑客实战Nginx日志分析
url_summary() { awk '{print $7}' nginx.log | sed -E 's@/[0-9]+@/int@g;s/[a-zA-Z0-9-]+.jpg/id.jpg/g;s/[a-zA-Z0-9-]+.png/id.png/g;s/[a-zA-Z0-9-]+.gif/id.gif/g' | sort | uniq -c | sort -nr | head -20; }
2 个赞
url_summary(){
awk '{print $7}' nginx.log | sed -e 's/[0-9a-f]\{8\}\(-[0-9a-f]\{4\}\)\{3\}-[0-9a-f]\{12\}/id/g' -e 's/\/[0-9a-z]\{32\}/\/id/g' -e 's/\b\/[0-9]\{3,\}\b/\/int/g' | sort | uniq -c | sort -nr | head -20
}
2 个赞
url_summary(){
awk '{print $7}' nginx.log | sed 's/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.png/id.png/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.jpg/id.jpg/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.gif/id.gif/g;s/\/[0-9]\{1,\}/\/int/g' | sort | uniq -c | sort -nr | head -20
}
url_summary(){
cat nginx.log | awk '{print $7}' | sed 's#/topics/[0-9]\+#/topics/int#g;s#/topics/int/replies/[0-9]\+#/topics/int/replies/int#g;s#/uploads/photo/2018/[0-9a-z\-]*#/uploads/photo/2018/id#g' | sort | uniq -c | sort -nr|head -20
}
url_summary()
{
echo "url_summary"
awk '{print $7 }' nginx.log | sed 's/topics\/[0-9]\+/topics\/int/g;s/replies\/[0-9]\+/replies\/int/g;s/\(-\|[0-9]\|[a-z]\)\+\.png/id.png/' | sort | uniq -c | sort -nr | head -20
}
awk '{print $7}' nginx.log | sed 's@\/topics\/[0-9]*@\/topics\\int@g ; s@replies\/[0-9]*@replies\/int@g ; s@photo\/\([0-9]\{4\}\)\/.*\.\([a-z]\{3\}\)@photo/\1/id.\2@g' | sort | uniq -c | sort -rn | head -20
awk '{print$7}' nginx.log | sed -e 's@/topics/[0-9]*@/topics/int@g;s@/replies/[0-9]*@/replies/int@g;s@/avatar/[0-9]*@/avatar/int@g;s@/[a-zA-Z0-9-]*.jpg@/id.jpg@g;s@/[a-zA-Z0-9-]*.png@/id.png@g'| sort | uniq -c | sort -nr | head -20
awk '{print $7}' nginx.log | sed 's/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.png/id.png/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.jpg/id.jpg/g;s/[0-9a-z]\{8\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{4\}\-[0-9a-z]\{12\}.gif/id.gif/g;s/\/[0-9]\{1,\}/\/int/g' | sort | uniq -c | sort -nr | head -20
awk '{print $7}' nginx.log|sed 's#/topics/[0-9]*#/topics/int#'|sed 's#/replies/[0-9]*#/repies/int#'|sed 's#/[0-9a-z-]*\.png#/id.png#' |sed 's#/[0-9a-z-]*\.jpg#/id.jpg#'|sed 's#/[0-9a-z-]*\.gif#/id.gif#' | sed 's#/[0-9a-z-]*\.jpeg#/id.jpeg#' |sort|uniq -c |sort -rn |head -20
gyan
(Yan)
15
课后作业 url_summary
演练数据
把/tmp/nginx.log文件复制到自己的家目录下,用来演练
要求:找出访问量最高的页面地址 ,借助于sed的统计分析
- /topics/16689/replies/124751/edit
- /_img/uploads/photo/2018/c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large
规则如下:
- 把 9497 改成 int ,输出为 /topics/int/replies/int/edit
- 把 c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large 改成 id.png!large ,输出为 /_img/uploads/photo/2018/id.png!large
规则参考如上:
- 输出 url pattern 对应的请求数量
- 取出top 20请求量的 url pattern
实现代码如下:
url_summary() {
awk '{print $7}' nginx.log | sed -E 's/[0-9]+/int/g;s/[0-9a-z-]+.png/id.png/g;s/[0-9a-z-]+.jpg/id.jpg/g;s/[0-9a-z-]+.gif/id.gif/g' | sort | uniq -c | sort -nr | head -20;
}
实现结果如下:
samjquan
(霍格沃兹-阿宏)
16
扩展正则元字符,可以使用 sed -E
,不用使用 \
反斜杠转译。
108709816
(shopping)
17
url_summary(){
awk '{print $7}' nginx.log | sed -E 's#/[0-9]+([/|\?])?#/int\1#g' | sed -E 's#/(.*)/(.*)?\.([jpg|png|gif])#/\1/id.\3#' | sort | uniq -c | sort -nr | head -20 ;
}
命令:awk ‘{print $7}’ nginx.log | sed -E ‘s#[0-9]+#int#g;s@[a-zA-Z0-9_-]+.png@id.png@g;s/[a-zA-Z0-9-]+.gif/id.gif/g’|sort | uniq -c | sort -nr | head -20
截图:
Yuxiao
(腾羽)
22
url_sumary(){
awk '{print $7}' nginx.log|sed 's@/[0-9]*/@/int/@g;s@/\w*\.png@/id.png@;s@/\w*\.jpg@/id.jpg@;s@?.*@@;s@/topics/[0-9]*$@/topics/int@'|sort |uniq -c |sort -nr|head -10
}
YAOJL
(紫~)
24
url_summary(){ awk ‘{print $7}’ nginx.log | sed -E ‘s/[0-9]+/int/g;s/[0-9a-z-]+.png/id.png/g;s/[0-9a-z-]+.jpg/id.jpg/g;s/[0-9a-z-]+.gif/id.gif/g’ | sort | uniq -c | sort -nr | head -20; }
课间作业:
find_error_log(){ grep -E ‘(" 404 |" 500 )’ nginx.log ;}
find_before(){ grep ‘" 500 ’ -C 1 nginx.log ;}
find_top_10(){ awk ‘{print $1}’ nginx.log|sort|uniq -c|sort -nr|head -10 ;}
url_summary(){ grep ’ /topics/’ nginx.log|sed -E ‘s@/topics/[0-9]+@/topics/number@;s@/replies/[0-9]+@/replies/number@;s@?.*@@;s@/node[0-9]+@/node@’|awk ‘{print $7}’|sort|uniq -c|sort -nr|head -1 ;}
课后作业
url_summary(){ sed -E ‘s@/topics/[0-9]+@/topics/int@;s@/replies/[0-9]+@/replies/int@;s@?.*@@;s@/node[0-9]+@/node@;s@/avatar/[0-9]+/@/avatar/int/@;s@/[0-9a-zA-Z-]+.png@/id.png@;s@/[0-9a-zA-Z-]+.jpg@/id.jpg@;s@/[0-9a-zA-Z-]+.gif@/id.gif@;s@/[0-9a-zA-Z-]+.jpeg@/id.jpeg@’ nginx.log|awk ‘{print $7}’|sort|uniq -c|sort -nr|head -20 ;}