前言
随便写写,大家也就随便看看,2020年,争取拿个乒乓球小区冠军。
鉴于高清无码图片较多,请在WIFI条件下观看。
如果想使用log日志做练习的帅哥们,可翻到页面底部,有获取文件的方式。
作为一个测试开发工程师,或者开发工程师,在面试时难免会遇到关于linux_shell的问题,作为一个热爱劳动的帅哥,已经就三剑客grep,awk,sed的用法做了一些
1.统计所有连接到shell服务器的外部IP数,以ip为准
netstat -tnp | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | awk ‘{if(NR>2)print}’ | sort | uniq -c |wc -l
- -F : 与'{print $1}'之间有一个空格的
- netstat -tnp查看 ***图1***
- awk '{print $5}' 取出第五列 ,然后我们的后续其实就是对这个第五列的数据进行处理 ***图2***
- awk -F: '{print $1}' 以冒号作为分割,取出IP ***图3***,可以看到servers和Address这2个数据我们并不需要
- 所以 awk '{if(NR>2)print}' 去除前2行的数据 ***图4***
- 后面就是一套组合拳 sort | uniq -c |wc -l 排序,去重,统计 ***图5***
因为外部IP是随时变化的,所以大家敲命令(netstat -tnp)的时候要多观察下,可能每次得出的结果都不同
2.找出nginx.log中的404的报错数据,统计下共有多少404报错
cat nginx.log | grep ‘200’ | wc -l // less nginx.log | grep ‘200’ | wc -l
- Less 启动前不必读取整个输入文件,因此对于大型输入文件,其启动速度比vi 之类的文本编辑器要快
- wc命令用于计算字数 -l 或 --lines 只显示行数。
- 都是从第一个命令的执行结果作为输入参数传递给第二个命令
awk ‘$9’ nginx.log | awk ‘{print $9}’| sort | uniq -c 图1
- sort命令默认将查询出来的数据从低到高(从小到大)排序 即:101-200-301-404-500
- uniq -c -c或--count 在每列旁边显示该行重复出现的次数 ***图1***
awk ‘$9~/404|500/’ nginx.log | awk ‘{print $9}’| sort | uniq -c
- sort -nr -n 依照数值的大小排序 -r 以相反的顺序来排序 ***图2***
awk ‘$9’ nginx.log | awk ‘{print $9}’| sort | uniq -c | sort -nr | head -1取出出现次数最多的数(828次) 图3
awk ‘$9’ nginx.log | awk ‘{print $9}’| sort | uniq -c | sort -n | head -1 取出出现次数最少的数(1次)图4
awk ‘$9’ nginx.log | awk ‘{print $9}’| sort | uniq -c | sort -nr | tail -1 取出出现次数最少的数(1次)图5
4.找出访问量最高的ip ,取前3条数据
cat nginx.log | awk ‘{print $1}’ | sort | uniq -c | sort -nr | head -3 图1
less nginx.log | awk ‘{print $1}’ | sort | uniq -c | sort -nr | head -3 图2
5.找出访问 /topics/xxxxx,以及访问topics/***/replies的 接口的请求分别有多少
首先要观察CTRL +F 全局搜索一下,看看topic接口和topic/***/replies的特点,不管是topic后面的数字还是topic后面的 *都是数字
grep -E 或 –extended-regexp : 将样式为延伸的正则表达式来使用
grep -E "/topics/[0-9] 图1
- ps: [0-9]表示找到一个位置上的字符只能是0-9这个范围内,同理
[^0-9]表示找到这个位置上的字符只能是除了0-9之外的所有字符
grep -E “/topics/[0-9]{1,}” nginx.log 图2
- {}一般用来匹配字符的长度,{1,}一般表示数字1到无穷大
grep -E “/topics/[0-9]{1,}” nginx.log | awk ‘{print $7}’ 提取出接口名称 图3
- 大家注意这里面会有一些接口格式包含了?然后拼接一些参数的,但是这不是我们需要的,所以要继续找到更精确的数据
grep -E “/topics/[0-9]{1,}” nginx.log | awk ‘{print $7}’ | grep ‘^/topics’ | sed ‘s/?.*//’ 图4
- 根据图4可以看到虽然已经过滤了?,但是还是有一些其他的字段存在eg:topics/8146/show_wechat
sed 's/要被取代的字串/新的字串/'
- -s 查找并替换
- -g 全局范围替换
- 测试:echo aaab | sed -e 's/a/c/' echo aaab | -e 's/a/c/g' 看一下输出就懂了
这儿我把命令写在下面一行了,不知道为什么在这儿编辑 $ 符号一直给我报错 图5
- 【命令在这】grep -E "/topics/[0-9]{1,}" nginx.log | awk '{print $7}' | grep '^/topics' | sed 's/?.*//' | sed -E 's@[0-9]{1,}$@###@g'
- 将所有以数字结尾的行,全局替换成###
@...@ || /.../ 相同的意思,定界符:设定界限的 符号
- 测试一下,下面2条命令输出的结果是相同的
1.grep -E "/topics/[0-9]{1,}" nginx.log | awk '{print $7}' | grep '^/topics' | sed 's/?.*//' | sed -E 's@[0-9]{1,}$@###@g'| wc -l
2.grep -E "/topics/[0-9]{1,}" nginx.log | awk '{print $7}' | grep '^/topics' | sed 's/?.*//' | sed -E 's/[0-9]{1,}$/###/g'|wc -l
- grep -E "/topics/[0-9]{1,}" nginx.log | awk '{print $7}' | grep '^/topics' | sed 's/?.*//' | sed -E 's/[0-9]{1,}$/###/g'| sed -E 's@/topics/[0-9]*/replies/[0-9]*/.*@/topics/replies@g' --图6
- 这儿由于格式问题,只能用代码块来写,不然*会自动切换格式隐藏掉
- 继续将topics/16689/replies/..格式的接口变换为topics/replies ,方便我们uniq -c去重统计
后面就是取出结果了,以一套组合拳收尾 图7
- grep -E "/topics/[0-9]{1,}" nginx.log | awk '{print $7}' | grep '^/topics' | sed 's/?.*//' | sed -E 's/[0-9]{1,}$/###/g'| sed -E 's@/topics/[0-9]*/replies/[0-9]*/.*@/topics/replies@g'|sort |uniq -c |sort -nr | head -2
6.找出nginx.log中访问量最高的接口地址,只要标准路径,把变化的数字,query参数或者变化的噪音字段全部去掉。
对的没错,就是像下面这样的,我们需要将一些噪音字段去掉,那必须是要用三贱客中的sed!
- /cable
- /topics/7386/replies/66058/reply_suggest 变成 /topics/replies
- /uploads/photo/2017/9eebf333-2729-467f-ac18-5a350608d865.png!large 变成 /uploads/photo/.png
但是我们这题重点不是找出访问最高的接口( 上去就是一套组合拳 ),而是要将接口中一些比较乱的数据给替换掉,我靠,太难了这谁会呀,快救我,表妹。首先我们需要将接口名称先取出来观察一下,可以看到接口名称是参差不齐,各有各的特点。
-
经过观察我们的log日志,发现很多接口名称中存在很多诸如get请求方式的接口名称,所以我们要先把 ? 后面的参数给update掉,便于后续操作,这个s///的语法我们前面已经说过了,这里面就不再多说了。
/topics/10075?order
语法都还是前面说过的,这里面就直接给大家参考了。大家看好了,我这里回车是为了页面好看,不是大家平时见到的那种每句末尾加一个 \ 那种写法,最后还是已组合拳收尾。
awk '{print $7}' nginx.log|sed 's/[?].*//'
|sed -E 's@/topics/[0-9]{1,}$@/topics/topics@g'
|sed -E 's@/topics/[0-9]*/replies/[0-9]*/.*@topics/replies@g'
|sed 's@/uploads/photo/.*@/uploads/photo.png@'
|sort|uniq -c|sort -nr |head -5
下一篇文章:如何使用Jenkins构建搭载钉钉以及邮箱通知
我希望在看这个文章的你,在新的一年,顺顺利利,并能够朝着定下得目标冲呀。
重点来了:
喜欢得朋友可以点个关注,今天这个文章真的是码了我4个多小时呢。老腰都酸死了。
本篇文章所用到得nginx日志都在本人得公众号,【回复】日志免费领取。