1

我有一个日志文件,其中充满了对我没有用的异常。

它每两秒生成一次,当查看包含 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 系统上涉足。

有人可以帮忙吗?

4

3 回答 3

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 ...成一行,然后删除该行。使用上述作为模板,可以以相同的方式过滤其他异常。

于 2013-07-30T07:11:11.020 回答
0

我不确定是否有办法做到这一点grep,但使用 Perl 之类的东西可能更容易:

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

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

于 2013-07-30T04:39:42.687 回答
0

使用 -A29 进行 Grepping 可能不适用于所有情况,因为有时异常跟踪可能在ERROR行之后的行数较少,或者可能更多,具体取决于 Exception。

只需使用您提供的日志片段,就可以使用 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+?caused.
) :添加此正则表达式组是因为有时存在来自 Java 的嵌套堆栈跟踪,通常第一行以“Caused By”开头,然后是一些以“at .. 。”。虽然,它可以选择包含这个。

这个 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
于 2016-08-17T19:03:06.313 回答