当文本出现在文件中时,如何用Bash做些什么

一旦某个文本出现在日志文件中,我想要运行一个命令。 我如何在Bash中做到这一点?

使用命令

tail -f file.log | grep --line-buffered "my pattern" | while read line do echo $line done 

在这里--line-buffered是关键,否则读取将失败。

只使用tail

 tail -f file.log | while read line; do if [[ $line == *text* ]]; then mycommand fi; done 

这应该工作,即使没有GNU的grep:

 tail -f -n 0 logfile.out | nawk '/pattern/ {system("echo do something here")}' 

编辑:添加“-n 0”,以便只有新的文本匹配。

你也可以看看inotailtail -f的替代品,只有当你感兴趣的文件改变时,它才会使用inotify框架来唤醒。 通常的tail -f只是在轮询之间短暂休息,这是一种有效但不是非常有效的解决方案。

我喜欢马特里的回答。 Bruno De Fraine的回答也很好,它只使用shell命令,而不使用其他程序(如awk)。 它遇到了整条线必须匹配魔术串的问题。 这个问题并不清楚,这是需求的一部分。

我会稍微修改它以处理原始问题中的“尽快”条款

 logfile_generator | tee logfile.out | nawk '/pattern/ {system("echo do something here")}' 

其中logfile_generator是首先生成日志文件的程序。 这个修改只要魔术字符串被找到就执行“东西”。