使用 grep 搜尋多個值

這是在 production 查資料時遇到的需求:想要從 log file 中同時查出符合 關鍵字1 或是 關鍵字2 的資料,相信熟悉的朋友一定可以馬上回答出這個需求的正確做法,無奈小弟太弱,加上不是很常用,每次需要時都要再查一次資料,雖然資料不難找,但需要用時都在 production,就是正急的時候,所以決定紀錄一下,臨時要用時可以更快找到

基本環境說明

  1. macOS Monterey 12.0.1
  2. grep (BSD grep, GNU compatible) 2.6.0-FreeBSD
  3. 模擬的 log 資料

    • test.log

      2021-12-17 09:00:38.192 [172][ERR][Demo.DomainService.Test.Application.Utilities.ExceptionInterceptor]General error
      message:"UserId:TW001|Name:Yowko|DepartmentId:D01"
      traceId:yowkotraceid
      2021-12-17 09:00:38.192 [172][ERR][Demo.DomainService.Test.Application.Utilities.ExceptionInterceptor]General error
      message:"UserId:SG001|Name:Tsai|DepartmentId:B01"
      traceId:tsaitraceid
      2021-12-17 09:00:38.192 [172][ERR][Demo.DomainService.Test.Application.Utilities.ExceptionInterceptor]General error
      message:"UserId:JP001|Name:Yua|DepartmentId:AV01"
      traceId:yuatraceid
      

使用方式

  1. 使用多個 -e

    • 語法

      grep -e {關鍵字1}[ -e {關鍵字2}] {檔案名稱}
      
    • 範例

      grep -e Yowko -e Yua test.log  
      
    • 實際效果

      1eoption

  2. 使用 regular expression

    • 語法

      grep '{關鍵字1}[\|{關鍵字2}]' {檔案名稱}
      
    • 範例

      grep 'Yowko\|Yua' test.log  
      
    • 實際效果

      2rex

  3. 使用 extended regular expressions

    • 使用 -E

      • 語法

        grep -E '{關鍵字1}[|{關鍵字2}]' {檔案名稱}
        
      • 範例

        grep -E 'Yowko|Yua' test.log  
        
      • 實際效果

        3Eoption

    • 使用 egrep

      搜尋結果沒有高亮顯示

      • 語法

        egrep '{關鍵字1}[|{關鍵字2}]' {檔案名稱}
        
      • 範例

        egrep 'Yowko|Yua' test.log  
        
      • 實際效果

        4egrep

心得

身為偷懶的工程師,我不會選用多個 -e,用傳統 regular expression 個人覺得有點難看或者該說容易讓真正要搜尋的內容失焦,而 egrep 則是因為結果沒高亮 我也不會選,所以原則上 我大多都是使用 extended regular expressions (-E),不過還是看使用當下的情境來選擇

如果使用時遇到關鍵字可能會被誤判為 grep 的 option,可以在 option關鍵字 間加上 -- 來區隔,例: grep -E -- 'Yowko|Yua' test.log

參考資訊

  1. How do I grep for multiple patterns with pattern having a pipe character?