【问题标题】:How to grep specific query in log如何在日志中grep特定查询
【发布时间】:2011-07-12 16:05:56
【问题描述】:

以下是我的日志。

2011-03-10 20:34:16,657  INFO [jdbc.sqlonly]
SELECT          COL1
    ,   COL2    -- some comments may be here
    ,   COL3
FROM        TABLE_A
WHERE       COL4 = 'some_text'
/* [related.classname] : some comments go here */
2011-03-10 20:34:16,658 DEBUG [another.class.name] blahblah
.
.
.
2011-03-10 20:34:16,843  INFO [jdbc.sqlonly]
SELECT         MAX(COL_A)
FROM        TABLE_B
WHERE       COL_T < CURRENT_TIMESTAMP
/* [other.classname] : some comments go here */
2011-03-10 20:34:16,844 DEBUG [other.class.name2] blahblah
.
.

我想用 tail -f 命令 grep 这个查询,并且只捕获相关的类名。 因为每个查询都包含换行符,所以使用 grep 命令无济于事。 我怎样才能做到这一点? 我担心使用 sed 的可能命令,如下所示。

tail -f some.log | sed -n '/jdbc\.sqlonly/,/2011-03-10 /p'

它可以帮助只找到查询,而不是调试日志,但没有捕获关联的类名(related.classname)。 请帮助我。啊,我的服务器是AIX。

【问题讨论】:

  • 你能告诉我们你想要什么作为你的输出吗?

标签: sed log4j grep aix


【解决方案1】:

对于我使用的 sed,范围命令似乎是贪婪的,并且匹配最后一个日期。

您可以 egrep 获取 'INFO|DEBUG' 并根据需要对其进行操作。

我希望这会有所帮助。

附:由于您似乎是新用户,如果您得到的答案对您有帮助,请记住将其标记为已接受,或者给它一个 +(或 -)作为有用的答案

【讨论】:

  • 再一次,如果您根据您发布的日志文件准确地指出您想要的结果,这将有助于您获得良好结果的机会。 (您可以编辑您的原始帖子)。 ...所以您希望您的输出只是/* [related.classname] : some comments go here */ 而不是/* [other.classname] : some comments go here */... 而且我假设'related.classname' 的值会发生变化,否则您只需搜索相关。那是你的问题吗?祝你好运!
【解决方案2】:

Awk 非常适合这种类型的任务。从根本上说,awk 脚本一次处理一行,但允许您在处理每一行时修改/读取全局变量。要将 awk 应用于此问题,您可以创建一个迷你状态机,该状态机在处理日志条目“内部”的行时会记住并打印“匹配”条目所需的任何信息。

这是一个示例 awk 程序。 BEGIN 块在处理任何输入之前执行一次,而主块每行执行一次 -- $0 包含整个行内容。

BEGIN{
    inmatch=0
    last=""
}
{
    if(match($0,"INFO|DEBUG")){
        if(inmatch){
            print last
        }
        inmatch=0
    }
    if(match($0,"jdbc\.sqlonly")){
        inmatch=1
    }
    last=$0
}

此脚本打印每个日志条目的最后一行,该行以包含jdbc.sqlonly 的行开头。新日志条目的开始定义为包含INFODEBUG 的任何行。 match() 函数的正则表达式参数可以很容易地调整。要运行脚本,请将其存储在文件中并按如下方式调用:

$ cat log.file | awk -f script.awk
/* [related.classname] : some comments go here */
/* [other.classname] : some comments go here */

“一次性”或单行 awk 脚本也可以在命令行中构建,这对于无法证明功能齐全的脚本语言的临时解决方案非常方便。

$ cat test.file | awk 'BEGIN{inmatch=0;last=""}{if(match($0,"INFO|DEBUG")){if(inmatch){print last}inmatch=0} if(match($0,"jdbc\.sqlonly")){inmatch=1}last=$0}'
/* [related.classname] : some comments go here */
/* [other.classname] : some comments go here */

【讨论】:

    【解决方案3】:

    这是我用的那个……

    tail -F yourLog.log | sed -nr ':main; /^2011.*sql/ { :loop; p; n; /^2011/ b main; b loop} '
    

    这里 2011 是每个日志行开头的模式。 sql 是我要搜索的词。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      相关资源
      最近更新 更多