Answers:
我不知道使用awk代替grep,但这对我有用:
tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'
编辑:正如dmourati和Caleb所 指出的,您也可以使用egrep
代替,grep -E
以方便使用。在某些系统上,这将是指向同一二进制文件的链接,而在其他系统上,这是grep软件包提供的副本。无论哪种方式,它都可以替代-E
交换机。但是,根据GNU grep手册页:
[…]两个变体程序
egrep
,fgrep
并且可用。egrep
与相同grep -E
。fgrep
与相同grep -F
。无论是作为直接调用egrep
或fgrep
已过时,但提供允许依赖这些历史的应用程序运行未经修改。
由于它们是同义命令,因此除非您完全没有egrep,否则它会优先考虑。但是,为了向前兼容,建议使用grep -E
语法,因为其他方法已正式弃用。
grep -E
而不是egrep
保证重复的答案吗?
sed
,awk
,perl
,multitail
或ninja_foo
。
尝试用管道将其过滤到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
。
您为什么要记录此信息?
如果您希望脚本行为取决于日志文件的内容,则可能希望使用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语句中指定模式,并指定不同的行为,并且可以将整个过程包装成一个循环,并且可以轻松编写功能非常强大的过滤器,该过滤器还将部分输入内容写入不同的文件,或者将其完全删除,或采取措施并根据您输入的内容运行其他脚本。
因此,归结于您为什么要尝试过滤日志文件,对日志输入采取措施,还是仅出于存档原因?