4

我想在日志文件中出现特定文本后立即运行命令。我如何在 Bash 中做到这一点?

4

5 回答 5

14

使用命令

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

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

于 2008-10-01T11:19:40.727 回答
5

仅使用tail

tail -f file.log | while read line; do if [[ $line == *text* ]]; then
    mycommand
fi; done
于 2008-10-01T11:33:48.537 回答
1

即使没有 GNU grep,这也应该可以工作:

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

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

于 2008-10-01T11:31:24.253 回答
1

您还可以查看inotail,一个替代品,仅在您感兴趣的文件发生更改时才tail -f使用inotify框架唤醒。通常tail -f只是在轮询之间休眠很短的时间,这是一种有效但不是非常有效的解决方案。

于 2008-10-05T12:51:33.637 回答
0

我喜欢matli的回答。Bruno De Fraine 的回答也很好,因为它只使用 shell ccommands,而不是其他程序(如 awk)。它存在整行必须匹配魔术字符串的问题。从作为要求的一部分的问题中不清楚。

我会稍微修改一下以处理原始问题中的“尽快”子句

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

其中 logfile_generator 是首先生成日志文件的程序。一旦找到魔术字符串,此修改就会执行“某事”。

于 2008-10-01T19:13:18.480 回答