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
輸出到檔案的指令,需要請自行在尾部新增.
- 查詢包含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 '
- 查詢包含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])))"
控制檯輸出
- 查詢包含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] } }"
控制檯輸出
- 輸出固定行內容,
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"引數相同。
相關文章
- Linux日誌搜尋 grepLinux
- MSSQL中按照日期來搜尋記錄.SQL
- JavaScript 搜尋關鍵字高亮效果JavaScript
- 1688關鍵字搜尋介面
- javascript搜尋關鍵字高亮效果JavaScript
- 搜尋Oracle DDL中的關鍵字Oracle
- 搜尋檔案中的關鍵字
- 如何高效利用 GitHub 關鍵字進行搜尋Github
- vue2實現搜尋結果中的搜尋關鍵字高亮Vue
- Idea全域性搜尋關鍵字Idea
- 1688關鍵字搜尋新品資料API介面(item_search_new-按關鍵字搜尋新品API
- item_search - 按關鍵字搜尋商品
- 淘寶API,按關鍵字搜尋淘寶商品API
- 1688關鍵字搜尋介面測試
- ionic2/ionic3 實現搜尋結果中的搜尋關鍵字高亮
- 使用grep搜尋多個字串字串
- 電商API分享:京東按關鍵字搜尋商品API
- SQL隱碼攻擊點搜尋關鍵字SQL
- BM42:語義搜尋與關鍵詞搜尋結合
- Win10系統怎麼設定搜尋功能指定日期範圍搜尋Win10
- 搜尋引擎關鍵字智慧提示的一種實現
- jquery搜尋關鍵詞高亮效果jQuery
- linux_script_批次搜尋指定串並取關鍵子Linux
- idea全域性搜尋的快捷鍵 idea搜尋內容快捷鍵Idea
- 1688按關鍵字搜尋新品資料說明
- jQuery搜尋框關鍵字自動匹配提示詳解jQuery
- php替換搜尋標題關鍵字為紅色PHP
- 語音技術——關鍵詞搜尋
- Linux常用指令---grep(搜尋過濾)Linux
- if判斷和grep命令-w及搜尋前後行
- 海量資料搜尋---搜尋引擎
- 改造layui-樹(tree)元件支援樹的關鍵字搜尋操作UI元件
- 亞馬遜平臺使用API介面透過關鍵字搜尋商品亞馬遜API
- 京東按關鍵字搜尋商品 API 返回值說明API
- 搜尋框關鍵字智慧匹配例項程式碼例項
- Kubernetes 中 搭建 EFK 日誌搜尋中心
- grep——高逼格 Linux文字搜尋神器Linux
- Linux文字搜尋工具grep使用詳解Linux