有一个/location/of/thefile
,它是一个不断变化的日志文件。平均刷新密度为每分钟 4 次,可能的最大刷新率可能为每分钟 30-40 次。每次刷新都会增加 2-5 行(平均),但在极端情况下可能会增加数百行。每行以[YYYY-MM-DD HH:MM:SS]
时间戳开头,后跟纯文本(100-200,最多几百个字符)。
我的任务是构建一个简单的命令它持续监视此日志文件,并将包含以下内容的每一行发送到标准输出foo
或者 bar
字母字符串。在这些(子)字符串之前和之后可以有任何字符(\n
当然,仅在(子)字符串之后),甚至\0
。单词的大写可以是所有可能的变体。
好吧,我对解决方案的想法总是包含计时系统调用,但我不应该使用它们。请为我构造一个简单的命令。非常感谢!
答案1
我可能误解了这个问题,但是你有理由不能使用这个吗?
tail -f /location/of/thefile | grep -i -E "foo|bar"
答案2
像这样使用命名管道:
让我们假设我们想要logfile.txt
连续读取文件并执行存储在readfile.sh
.
# readfile.sh
while read line
do
echo $line
done < mypipe
$ mkfifo mypipe
$ #this will block (will not exit)
$ ./readfile.sh
在另一个 shell 中,但在同一个目录中(文件 mypipe 所在的位置):
$ # This will go to background
$ tail -f logfile.txt >> mypipe &
完毕。无论不断进入 logfile.txt 的内容都将通过readfile.sh
未退出的方式打印。