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

Moshow鄭鍇發表於2020-04-07

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"引數相同。

相關文章