如何插出相同模式的多行?

时间:2013-07-30 04:12:20

标签: linux sed awk grep

我有一个日志文件,里面填充了对我没用的异常。

它每两秒生成一次,当查看包含24小时日志记录的日志文件时,获取我需要的相关信息变得势不可挡。

我的日志看起来像这样:

2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
  at java.net ......
  at java.apache ....
  and 28 more lines like these.

我想将日志副本清理到另一个文件。

显然是grep -v“string”-A29 foo.log> new_file.log无法帮助我过滤掉这30行。

我还尝试了几个sed和awk语句,我看到了其他类似问题。但他们似乎都没有帮助。

我更喜欢网络管理员在Linux系统上沾沾自喜。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed '/ERROR java-class - Exception/{:a;$!N;/\n\s*at\s.*/s///;ta;D}' file >new_file

ERROR java-class - Exeption之后的所有行以空格开头,然后将at ...收集到一行,然后删除该行。使用上述作为模板,可以以相同的方式过滤其他异常。

答案 1 :(得分:0)

我不确定是否可以使用grep进行此操作,但使用Perl可能更容易:

perl -ne '$m = 0 if m/string/; print if $m++ > 29' foo.log > new_file.log

(此处$m是自包含string的最后一行以来的行数。)

答案 2 :(得分:0)

使用-A29进行Grepping可能在所有方案中都不起作用,因为有时异常跟踪在 ERROR 行之后可能具有较少的行数,或者可能更多地取决于异常。

只需使用您提供的日志片段,就可以使用egrep和regex删除整个异常跟踪。假设log.txt文件具有以下记录器语句(具有良好的行以及来自异常跟踪的行):

A good line that should be captured - 1
2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
  at java.net ......
  at java.apache ....
A good line that should be captured - 2
2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
  at java.net ......
  at java.apache ....
A good line that should be captured - 3
2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
  at java.net ......
  at java.apache ....
A good line that should be captured - 4
2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
  at java.net ......
  at java.apache ....
A good line that should be captured - 5
2013-04-21 00:00:00,852 [service name] ERROR java-class - Exception 
  at java.net ......
  at java.apache ....

要仅检索不属于异常跟踪的行,请使用以下egrep:

egrep -vi "(error|(^\s+AT.*)|(^\s+?caused.*))" log.txt > /path/to/any/file

i:用于忽略正则表达式中的大小写。为了证明有目的地将"错误" 保持为小写," AT" 保持大写。

(^ \ s + AT。): 查找以空格开头的任何行,后跟" at" 其次是任何字符。

(^ \ s +?cause。
):此正则表达式组已添加,因为有时会有来自Java的嵌套堆栈跟踪,通常第一行以< strong>&#34;引起&#34; ,然后是&#34;开始的一些堆栈跟踪行在...&#34; 。虽然,它可以选择包括这个。

此egrep的输出

A good line that should be captured - 1
A good line that should be captured - 2
A good line that should be captured - 3
A good line that should be captured - 4
A good line that should be captured - 5