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