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 替换为分隔符中的实际破折号数。

相关内容