在 tail -f 中,如何过滤掉包含特定关键字的内容?

在 tail -f 中,如何过滤掉包含特定关键字的内容?

我想要tail -f我的日志。但是,我想过滤掉所有含有以下字词的内容:

“ELB”、“Pingdom”、“健康”

答案1

我不知道如何使用 awk 代替 grep,但这对我有用:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

编辑:作为德穆拉蒂迦勒 指出,为了方便起见,您也可以使用egrep而不是grep -E。在某些系统上,这将是指向同一二进制文件的链接,在其他系统中,这将是 grep 包提供的二进制文件的副本。无论哪种方式,它都可以作为-Eswitch 的替代品。但是,根据 GNU grep 手册页:

[…] 有两个变体程序egrepfgrep可用。egrep与相同grep -Efgrep与相同grep -F。直接调用或egrepfgrep被弃用,但允许依赖它们的历史应用程序在未经修改的情况下运行。

由于它们是同义命令,因此除非您根本没有 egrep,否则这取决于您的偏好。但是,为了向前兼容,建议使用该grep -E语法,因为其他方法已被正式弃用。

答案2

尝试将其通过管道传输到 egrep,并使用管道分隔要过滤掉的单词列表:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

请注意,在匹配列表周围使用括号是可选的。由于|grep 将 视为逻辑或运算符,无论它是否作为子组的一部分出现。'(ELB|Pingdom|Health)'功能完全相同。对于某些人来说,语法可能更明显;我发现不用括号更容易输入,因为我可以从单个匹配项切换到可能匹配项的列表,而无需返回添加括号。

为了加分,值得一提的是,multitailninja foo 在过滤输出时确实发挥了作用。例如,您可以像这样过滤您的单词:

multitail -e ELB -e Pingdom -e Health -f log_file

您还可以使用它来为输出添加颜色或者以其他方式突出显示,而不仅仅是对其进行过滤。

编辑:DTest 答案以及关于 egrep 如何成为一种弃用的替代方法来启动 的完整解释的评论grep -E

答案3

tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'

答案4

为什么要记录这些信息?

  • 它仅仅用于档案吗?
  • 您是否想根据日志文件中的不同关键字或模式有条件地执行不同的脚本?

如果您希望根据日志文件的内容执行脚本行为,您可能希望使用 Expect 进行过滤。(http://en.wikipedia.org/wiki/Expect) Expect 是一个 Tcl 扩展,但还有一个 Python 版本的 Expect。

Expect 为您提供了这个强大而灵活的 switch 语句,它允许您根据输入流中存在的状态或模式有条件地指定不同的行为。例如:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

因此,您可以在 expect 语句中指定模式,并指定不同的行为,您可以将整个过程包装在一个循环中,并且可以轻松编写非常强大的过滤器,将输入的部分写入不同的文件,或将其完全删除,或者根据输入的内容采取行动并运行其他脚本。

所以,归根结底,您为什么要过滤日志文件、对日志输入采取行动,或者仅仅出于存档的原因?

相关内容