《码了4个小时》一线大厂面试必会的Linux_shell三贱客,如何一文搞定

前言
随便写写,大家也就随便看看,2020年,争取拿个乒乓球小区冠军。
鉴于高清无码图片较多,请在WIFI条件下观看。
如果想使用log日志做练习的帅哥们,可翻到页面底部,有获取文件的方式。

1 前言

作为一个测试开发工程师,或者开发工程师,在面试时难免会遇到关于linux_shell的问题,作为一个热爱劳动的帅哥,已经就三剑客grep,awk,sed的用法做了一些

总结,学会了下面这几种题型,面试时必不可能失败。
在这里插入图片描述

2 正文

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 只显示行数。
    
    - 都是从第一个命令的执行结果作为输入参数传递给第二个命令
    


    3.找出nginx.log中的错误状态码(404/500/301/200…)出现次数最多和最少的状态码

  • 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

在这里插入图片描述

3 结束语

下一篇文章:如何使用Jenkins构建搭载钉钉以及邮箱通知
我希望在看这个文章的你,在新的一年,顺顺利利,并能够朝着定下得目标冲呀。
在这里插入图片描述
重点来了:
喜欢得朋友可以点个关注,今天这个文章真的是码了我4个多小时呢。老腰都酸死了。
本篇文章所用到得nginx日志都在本人得公众号,【回复】日志免费领取。
在这里插入图片描述

发布了39 篇原创文章 · 获赞 19 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章