我想tail -f
我的日志。 但是,我想过滤出所有的词:
“ELB”,“Pingdom”,“健康”
我不知道如何使用awk而不是grep,但这对我有用:
tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'
编辑:正如dmourati和迦勒指出的,你也可以使用egrep
而不是grep -E
为了方便。 在一些系统上,这将是一个链接到相同的二进制文件,在其他人的一个副本由grep包提供。 无论哪种方式,它作为-E
开关的替代品而存在。 但是,根据GNU的grep手册页:
两个变体程序
egrep
和fgrep
可用。egrep
与grep -E
相同。fgrep
与grep -F
相同。 作为egrep
或fgrep
直接调用已被弃用,但被提供来允许依赖于它们的历史应用程序未经修改地运行。
既然他们是同义的命令,它归结为偏好,除非你根本没有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采取行动,或仅仅是为了档案的原因?