《碼了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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章