在tail -f中,如何过滤出具有某些关键字的内容?


Answers:


58

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

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

编辑:正如dmouratiCaleb所 指出的,您也可以使用egrep代替,grep -E以方便使用。在某些系统上,这将是指向同一二进制文件的链接,而在其他系统上,这是grep软件包提供的副本。无论哪种方式,它都可以替代-E交换机。但是,根据GNU grep手册页:

[…]两个变体程序egrepfgrep并且可用。egrep与相同grep -Efgrep与相同grep -F。无论是作为直接调用egrepfgrep已过时,但提供允许依赖这些历史的应用程序运行未经修改。

由于它们是同义命令,因此除非您完全没有egrep,否则它会优先考虑。但是,为了向前兼容,建议使用grep -E语法,因为其他方法已正式弃用。


使用grep -E而不是egrep保证重复的答案吗?
卡雷布(Caleb)

@Caleb我不明白为什么不。剥皮猫的方法不只一种,而且该网站还可以列出所有猫
DTest 2011年

1
是的,但是它们仅仅是彼此的符号链接,而不是两个功能重叠的不同程序。那么,那岂不是更多的“附录”(阅读:评论),而不是完整的答案吗?我曾为较轻的罪行投下票...
Marcin

@DTest:按权利计,dmourati实际上击败了我几秒钟,尽管他没有解释他在这里值得赞扬的理由。您参加聚会显然很晚,因为在您加入之前,我们俩都至少有两次投票。将语法从符号链接的二进制更改为参数通常是您要使用注释而不是单独的答案。如果你想皮肤猫不同的方式使用sedawkperlmultitailninja_foo
卡莱布(Caleb)

1
@DTest:我可以自由地对您的答案进行重大的事实编辑,以添加一些原始资源。推荐使用-E,以备将来使用,因此我进行了标记,但删除了有关没有egrep的发行版的注释。提到的发行版确实有egrep,它只是一个单独的二进制文件而不是符号链接。
卡莱布(Caleb)

21

尝试用管道将其过滤到egrep中,并用管道将要过滤的单词列表分开:

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

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

值得一提的是,值得一提的multitail是在过滤输出时使用ninja foo。例如,您可以过滤这样的单词:

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

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

EDit:请参阅DTests的答案和注释,以获取有关egrep如何只是一种不推荐的替代触发方式的完整说明grep -E


2
表达式不应该以(')结尾,而不是以(“)
结尾

是的,谢谢,那是一个错字。堆栈交换站点的功能类似于Wiki,以备将来参考,您可以修复该问题。
卡莱布(Caleb)

我以为编辑必须超过6个字符?
Sirex

如果您没有很高的代表,是的,最少要有6个字符,但是在这种情况下,1个字符非常重要。您可以通过在正文中添加HTML注释来强制进行更改。字符将计入限制,您可以记下进行更改的原因。
迦勒(Caleb)

@Caleb非常感谢多尾建议,太棒了!不能相信我没有它走了这么久。
sidewinderguy


3

您为什么要记录此信息?

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

如果您希望脚本行为取决于日志文件的内容,则可能希望使用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语句中指定模式,并指定不同的行为,并且可以将整个过程包装成一个循环,并且可以轻松编写功能非常强大的过滤器,该过滤器还将部分输入内容写入不同的文件,或者将其完全删除,或采取措施并根据您输入的内容运行其他脚本。

因此,归结于您为什么要尝试过滤日志文件,对日志输入采取措施,还是仅出于存档原因?


再加上一个供我参考的Expect,这是我很久以前使用的,已经完全忘记了。
MPi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.