前言
隨便寫寫,大家也就隨便看看,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日誌都在本人得公衆號,【回覆】日誌免費領取。