在尾巴-f,我如何过滤具有特定关键字的东西?

我想tail -f我的日志。 但是,我想过滤出所有的词:

“ELB”,“Pingdom”,“健康”

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

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

    编辑:正如dmourati和迦勒指出的,你也可以使用egrep而不是grep -E为了方便。 在一些系统上,这将是一个链接到相同的二进制文件,在其他人的一个副本由grep包提供。 无论哪种方式,它作为-E开关的替代品而存在。 但是,根据GNU的grep手册页:

    两个变体程序egrepfgrep可用。 egrepgrep -E相同。 fgrepgrep -F相同。 作为egrepfgrep直接调用已被弃用,但被提供来允许依赖于它们的历史应用程序未经修改地运行。

    既然他们是同义的命令,它归结为偏好,除非你根本没有egrep。 但是为了向前兼容,build议使用grep -E语法,因为其他方法已被正式弃用。

    尝试用pipe道隔开你想要过滤的单词列表来pipe道它egrep:

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

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

    对于额外的功劳,值得一提的是multitail在进行过滤输出的时候会用ninja foo。 例如,你可以过滤你的话是这样的:

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

    您也可以使用它来上色或以其他方式突出显示输出,而不是仅仅对其进行过滤。

    编辑:请参阅DTests的答案和评论,如何egrep只是一个不推荐使用grep -E替代方法的完整解释。

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

    你为什么要logging这些信息?

    • 这是严格的档案?
    • 您是否要根据日志文件中的不同关键字或模式有条件地执行不同的脚本?

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

    期望给你这个强大的灵活的开关像声明,让您指定不同的行为有条件地取决于状态或inputstream中存在的模式。 例如:

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

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

    所以,归结到为什么你要过滤你的日志文件,对日志input采取行动,或仅仅是为了档案的原因?