下午专家。
我有一个填充了错误的日志文件。这是一个简明版本:
*****2015-05-19 17:10:23,536 [ajp-0.0.0.0-8009-31] (TqlBuilder.java:347) ERROR - DUMMY From TqlBuilder getQueryDefinition
java.lang.Exception
xxxxxxx
xxxxxxxxx
xxxxxxx
2015-05-19 17:10:23,588 [ajp-0.0.0.0-8009-31] (TqlBuilder.java:348) ERROR - DUMMY From SqlBuilder
java.lang.Exception
xxxx
xxxx
xxxx
xxxxxxxx
2015-05-19 17:10:23,598 [ajp-0.0.0.0-8009-31](TqlBuilder.java:351)错误 - Bla Bla Bla java.lang.Exception的 XXXX XXXX XXXX XXXXXXXX **
我想提出一个基于Bash的解决方案(一直尝试使用grep,但成功有限)将此日志传递到填充了黑名单文件(下面的示例错误列表),以清除原始文件这些错误并生成一个新文件,清除黑名单中的所有错误,以及后面的行。
以下是我的黑名单示例
(TqlBuilder.java:347) ERROR - DUMMY From TqlBuilder getQueryDefinition
(TqlBuilder.java:348) ERROR - DUMMY From SqlBuilder
使用普通grep我只能删除行,但我需要一个解决方案来删除错误后面的行。我想过让grep删除Date' Tags'之间的所有行。但我无法弄清楚如何去做。
将原始内容应用于黑名单后,新的已清理文件的预期输出将为:
**2015-05-19 17:10:23,598 [ajp-0.0.0.0-8009-31] (TqlBuilder.java:351) ERROR - Bla Bla Bla
java.lang.Exception
xxxx
xxxx
xxxx
xxxxxxxx**
答案 0 :(得分:0)
Grep本身无法做到这一点。您需要使用已编译的程序或某种类型的脚本(语言并不重要)。虽然您可以使用多行匹配正则表达式执行此操作。在遍历文件时跟踪状态会更直接。在伪代码中,例如:
inBlackList = false
while ( read next line )
{
if ( ( inBlackList == false ) && ( current line starts blacklisted entry ) )
{
inBlackList = true
}
else if ( ( inBlackList == true ) &&
( current line starts new error ) && ( current line does not start blacklisted entry ) )
{
inBlackList = false
}
if ( inBlackList == false )
{
output current line to new file
}
} # End while