grep搜索服務器日誌(搜索指定關鍵字的行,按照日期group by count)

what’s grep

grep (globally search a regular expression and print,以正則表達式進行全域尋找以及列印)是一種強大的文本搜索工具,在給出文件列表或標準輸入後,grep會對匹配一個或多個正則表達式的文本進行搜索,並只輸出匹配的行或文本。十分靈活和強大

前言

grep的強大,在於他與其他命令一起的連用,從簡單到複雜,拼接功能實現強大的邏輯

例如這麼一個功能,需要各種神方法從服務器搜索日誌:

  • 查找包含指定關鍵字的文件的文件名(包含某一錯誤信息的日誌文件名,一般帶有日期)
  • 查找包含指定關鍵字的文件的行(包含某一錯誤信息的行,一般帶有行號或者錯誤位置或者日期等其他信息)
  • 輸出包含指定關鍵字每天出現的次數(假設日誌錯誤行包含有日期或者日誌文件名包含日期)
  • 從固定格式的文件中輸出指定行內容(適用於報文/批量等固定格式的文件)
  • 輸出到日誌文件(控制檯不便於copy和整理)

需要

  • cd切換到日誌文件的目錄
  • Windows可以用 git bash 或者 裝個cmder(推薦) ,Linux下直接使用原生Shell即可
  • 輸出的日誌文件會影響到查找的內容,主要不要輸出在當前文件夾,或者輸出後處理掉,避免影響結果(因爲在同個目錄下)
  • 正則表達式記不住沒關係,從 https://tool.oschina.net/regex 找即可

可能會一起用到的命令

  • cat
  • awk
  • sed

實戰

以下命令省略後面的>error500-x.txt 輸出到文件的指令,需要請自行在尾部添加.

  1. 查找包含500錯誤的行內容並輸出到error500.txt
grep -rn "HTTP protocol error 500 (Internal Server Error)"

控制檯輸出包含指定關鍵字的行

ServerLog_2020_01_07_08_02_39.log:685:          2020-01-07 08:02:42 0061                     'protocol error 500 (Internal Server Error): 3rd System API '
  1. 查找包含500錯誤的日期,-oE後面加正則表達式用於提取日期
grep -rn "HTTP protocol error 500 (Internal Server Error)" | grep -oE "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))"

控制檯輸出
在這裏插入圖片描述

  1. 查找包含500錯誤的日期並進行分組統計,awk "{s[$1]+=1}END{ for(i in s){ print i, s[i] } }" 中的+=1代表遇到1個就累計加一,但那時有些情況需要累計加0.5,例如一行出現兩個日期等等,根據實際情況修改
grep -rn "HTTP protocol error 500 (Internal Server Error)" | grep -oE "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][ 0-9]|2[0-8])))"  | Sort |  awk "{s[$1]++}END{ for(i in s){  print i, s[i] } }"

控制檯輸出
在這裏插入圖片描述

  1. 輸出固定行內容,470,470p代表輸出第470行,470,480p代表輸出470~480行.
sed -n '470,470p' SeverLog_2020_01_08_08_19_40.log

控制檯輸出

020-01-08 08:19:40 0169 Environment=PROD,v_user_id=zhengkai2020upupup

附錄:grep命令參數大全

  • -a 或 --text : 不要忽略二進制的數據。
  • -A<顯示行數> 或 --after-context=<顯示行數> : 除了顯示符合範本樣式的那一列之外,並顯示該行之後的內容。
  • -b 或 --byte-offset : 在顯示符合樣式的那一行之前,標示出該行第一個字符的編號。
  • -B<顯示行數> 或 --before-context=<顯示行數> : 除了顯示符合樣式的那一行之外,並顯示該行之前的內容。
  • -c 或 --count : 計算符合樣式的列數。
  • -C<顯示行數> 或 --context=<顯示行數>或-<顯示行數> : 除了顯示符合樣式的那一行之外,並顯示該行之前後的內容。
  • -d <動作> 或 --directories=<動作> : 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep指令將回報信息並停止動作。
  • -e<範本樣式> 或 --regexp=<範本樣式> : 指定字符串做爲查找文件內容的樣式。
  • -E 或 --extended-regexp : 將樣式爲延伸的正則表達式來使用。
  • -f<規則文件> 或 --file=<規則文件> : 指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式爲每行一個規則樣式。
  • -F 或 --fixed-regexp : 將樣式視爲固定字符串的列表。
  • -G 或 --basic-regexp : 將樣式視爲普通的表示法來使用。
  • -h 或 --no-filename : 在顯示符合樣式的那一行之前,不標示該行所屬的文件名稱。
  • -H 或 --with-filename : 在顯示符合樣式的那一行之前,表示該行所屬的文件名稱。
  • -i 或 --ignore-case : 忽略字符大小寫的差別。
  • -l 或 --file-with-matches : 列出文件內容符合指定的樣式的文件名稱。
  • -L 或 --files-without-match : 列出文件內容不符合指定的樣式的文件名稱。
  • -n 或 --line-number : 在顯示符合樣式的那一行之前,標示出該行的列數編號。
  • -o 或 --only-matching : 只顯示匹配PATTERN 部分。
  • -q 或 --quiet或–silent : 不顯示任何信息。
  • -r 或 --recursive : 此參數的效果和指定"-d recurse"參數相同。
  • -s 或 --no-messages : 不顯示錯誤信息。
  • -v 或 --revert-match : 顯示不包含匹配文本的所有行。
  • -V 或 --version : 顯示版本信息。
  • -w 或 --word-regexp : 只顯示全字符合的列。
  • -x --line-regexp : 只顯示全列符合的列。
  • -y : 此參數的效果和指定"-i"參數相同。
發佈了296 篇原創文章 · 獲贊 416 · 訪問量 116萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章