我希望在日志文件中出现某个文本后立即运行命令。我如何在Bash中做到这一点?
答案 0 :(得分:14)
使用命令
tail -f file.log | grep --line-buffered "my pattern" | while read line
do
echo $line
done
此处--line-buffered
是关键,否则读取将失败。
答案 1 :(得分:5)
仅使用tail
:
tail -f file.log | while read line; do if [[ $line == *text* ]]; then
mycommand
fi; done
答案 2 :(得分:1)
即使没有GNU grep,这也应该有效:
tail -f -n 0 logfile.out | nawk '/pattern/ {system("echo do something here")}'
编辑:添加“-n 0”,以便只匹配文本的新出现。
答案 3 :(得分:1)
另外,您可以查看inotail
,它是tail -f
的替代品,它使用inotify
框架仅在您感兴趣的文件发生更改时才会唤醒。通常的tail -f
只是在轮询之间短时间内睡觉,这是一种有效但不是非常有效的解决方案。
答案 4 :(得分:0)
我喜欢matli的回答。 Bruno De Fraine的答案也很好,它只使用shell命令,而不是其他程序(如awk)。它遇到的问题是整行必须匹配魔术字符串。从问题中不清楚这是要求的一部分。
我会稍微修改它以处理原始问题中的“尽快”条款
logfile_generator | tee logfile.out | nawk '/pattern/ {system("echo do something here")}'
其中logfile_generator是首先生成日志文件的程序。只要找到魔术字符串,此修改就会执行“某事”。