三剑客实战Nginx日志分析
三剑客grep、sed、awk、正则总结
正则分为普通正则和扩展正则
普通正则:
1. .*可以匹配多个任意字符
2. \b是匹配单词的,匹配有空格的单词
扩展正则:
1.支持扩展正则 如grep时,要加 -E参数
2. 注意⚠️grep不支持正则中的\d 用[0-9]还有\w
3. grep -P 意思是支持perl语法
4.另外在命令或脚本中要注意" "会转译,' '不转译
推荐详细学正则的网站:https://deerchao.cn/tutorials/regex/regex.htm
找出log中的404 500的报错有多少条
1)grep -E '\s500\s|\s404\s' nginx.log | wc -l (使用扩展正则)
2)grep -cE '\s500\s|\s404\s' nginx.log (grep -c 和wc -l使用效果是一样的,都是统计条数)
3)awk '$9~/404|500/' nginx.log |wc -l (注意⚠️$9~ 不加{print}默认就是print,如果 不加$9 默认为$0~,就是整行的意思,就默认整行中查找404和500,)
找出访问量最高的前三名ip
1)awk '{print $1}' nginx.log |sort|uniq -c|sort -nr; awk '{print $1}' nginx.log |sort|uniq -c|sort -nr|head -3
分析:sort 排序,是一个经常使用的命令; 将重复的放在一起进行排序, sort默认排序是字典序,相对数字排序必须要加上-n加r -nr是反转;
uniq合并在: 是合并相邻的 ,因此要先用sort排序, 将重复的数据放在一起 -c可以计算出重复的有多少个
head -3 取出头部前三名
另外如果 想要把前面的统计数字去掉,在后面在加上一个awk筛选: awk '{print $1}' nginx.log |sort|uniq -c|sort -nr|head -3|awk '{print $2}’
2) grep -o '^[0-9]*.[0-9]*.[0-9]*.[0-9]*' nginx.log |sort|uniq -c|sort -nr|head -3(注意⚠️ 加.是任意字符匹配的意思,不是ip中的. 加参数 -o 只显示匹配到的字符)
也可以通过grep 加正则的形式筛选出访问量前3的ip
只要思路清楚,命令可以一直通过练习加强
学习方法:学习shell脚本编程的时候,可以把平时用python写的代码转化成shell脚本用来练习
将topics后面的数字替换成number
grep 'topics' nginx.log | sed 's@/topics/[0-9]*@/topics/numbers@g'
分析:注意⚠️sed 's后的/可以用@替换,或者其他#、*都可以,为了区别于其他的/
将IP地址横向打印
awk '{print $1}' nginx.log |sed ':f;N;s/\n/|/g;tf'
分析: sed的标记和跳转用法; 标记在前面 f(前面可以加f、1等任意字符):,;tf后面跳转也是
使用该命令后的效果:将一行一行的ip转换成一行,并用|隔开