【问题标题】:Need to parse a log file against a Blacklist需要针对黑名单解析日志文件
【发布时间】:2015-06-18 13:32:42
【问题描述】:

下午专家。

我有一个包含错误的日志文件。这是一个精简版:

*****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.异常 xxxx xxxx xxxx xxxxxxxx**

我想提出一个基于 Bash 的解决方案(一直在尝试使用 grep,但成功有限)通过填充了(下面的示例错误列表)的黑名单文件传递此日志,以清理原始文件这些错误并生成一个新文件,其中清除了黑名单中的所有错误以及随后的行。

这是我的黑名单示例

(TqlBuilder.java:347) ERROR - DUMMY From TqlBuilder getQueryDefinition
(TqlBuilder.java:348) ERROR - DUMMY From SqlBuilder 

使用普通的 grep 我只能删除这些行,但我需要一个解决方案来删除错误后面的行。我想过让 grep 删除日期“标签”之间的所有行,但我无法弄清楚如何去做。

在将原始文件应用于黑名单后,我对新的、已清理文件的预期输出将是:

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

【问题讨论】:

  • 你有没有想过使用像 stash 这样的东西?
  • This post 可能会有所帮助。你见过吗?
  • Tichodroma,请问您有什么建议吗?

标签: java linux grep


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2016-01-09
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多