需要针对黑名单解析日志文件

时间:2015-06-18 13:32:43

标签: java linux grep

下午专家。

我有一个填充了错误的日志文件。这是一个简明版本:

*****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**

1 个答案:

答案 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