我有一个日志文件,里面填充了对我没用的异常。
它每两秒生成一次,当查看包含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系统上沾沾自喜。
有人可以帮忙吗?
答案 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