如何匹配以 TAB 开头的多行以及一组中第一行之前的行?

如何匹配以 TAB 开头的多行以及一组中第一行之前的行?

我有一些第三方日志文件,我正在尝试从命令行中提取错误。

日志如下所示:

time=1
time=2
time=3
  at com.test.com....
  at com.test.com....
  at com.test2.com....
time=4
time=5
time=6
time=7
time=8
time=9
  at org.badstuff.com...
  at org.badstuff.com...
  at org.badstuff.com...
time=10
time=11

以 开头的行at以 TAB 字符开头,因此可以轻松匹配。

我怎样才能从这个文件中提取这些堆栈跟踪,每次在第一个堆栈跟踪之前有几行?我使用的是 Mac,但如果可能的话,我更喜欢在 Mac/Linux 上运行的通用解决方案,因为我必须经常在两者上工作。

所以从上面的例子中,我会得出以下内容

time=2
time=3
  at com.test.com....
  at com.test.com....
  at com.test2.com....
time=8
time=9
  at org.badstuff.com...
  at org.badstuff.com...
  at org.badstuff.com...

答案1

只需使用中的-Aafter context、-Before context 或-Context 选项grep,例如以适合您的示例:

grep -B2 '^\t' file

答案2

用于grep -B2 -P '^\t' logfile在每组比赛之前拾取两行。您可能需要屏蔽插入在匹配项之间的组分隔符“--”。

结果

$ grep -B2 -P '^\t' /tmp/t
time=2
time=3
        at com.test.com....
        at com.test.com....
        at com.test2.com....
--
time=8
time=9
        at org.badstuff.com...
        at org.badstuff.com...
        at org.badstuff.com...

相关内容