Grep 日誌並取得日誌分隔符號之間的文本

Grep 日誌並取得日誌分隔符號之間的文本

有沒有辦法grep記錄並尋找日誌條目分隔符號之間的文字?我們的日誌檔案用字元“”分隔行條目,-------因此當我搜尋文字單字時,我想要日誌中分隔符號之前和之後的所有行。

日誌樣本

------------------------------------------------------------------------

    r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines
    Removed unused "Calculated Fields" column entry.
    Jira ID: JIRA-977

------------------------------------------------------------------------

在上面我會 Grep 這個字 Fields 但想要「----」行之間的所有行

答案1

如果您知道記錄有多大,那麼您可以在匹配行之前 ( -B) 和之後 ( ) 輸出額外的上下文行,例如-A

grep -A2 -B2 'Fields' sample.log

或用於匹配線之前和之後的上下文

grep -C3 'Fields' sample.log

據我所知,在 GNU grep 中進行真正的多行匹配(而不是單行匹配加上下文)的唯一方法是使用 PCRE 正則表達式模式 ( -P) 和-z標誌來防止換行符中斷。例如,你可以嘗試

grep -zPo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'

它對由任何字元或換行符包圍的字串進行非貪婪匹配Fields,前提是它由換行符-連字符-換行符分隔符號。 pcregrep 中的等效表達式是

pcregrep -Mo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'


這種記錄結構資料的另一種選擇是 awk:特別是,GNU awk 允許將正規表示式用於內部記錄分隔符RS例如

$ gawk -vRS='\n-+\n' '/Fields/ {print}' sample.log

r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines

Removed unused "Calculated Fields" column entry.

Jira ID: JIRA-977

答案2

類似於gawk中的一個 Perl 解決方案鋼鐵司機的回答如果gawk不可用:

perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file

將 72 替換為分隔符號中的實際破折號數。

相關內容