我实际上正在尝试编写一个 shell 脚本,将命令的输出记录到文件中,但由于该命令需要很长时间才能完成(大约 15 分钟),所以我想在命令完成之前开始解析命令的输出(文件的内容),这样我就可以向标准输出(用户)发送消息,例如:
10% complete
45% complete
等等。
程序步骤
- 将命令重定向到文件:$(command) > $FILE
- 在命令完成之前开始读取和解析输出 ($FILE)。
我考虑过使用并行编程,但我还没有掌握它。
答案1
我实际上已经使用tail
Stack Overflow 问题解决了这个问题在 shell 脚本中结束 tail -f 启动。
# Solution
($(command) > ${FILE}) &
tail -f --pid=$! ${FILE} | while read line
do
echo $line
# Can parse each line output here
# Example: send errors to log file
if echo $line | grep -qi "error"
then
echo $line >> ${LOG}
fi
done
谢谢大家的帮助。
答案2
tail -f 将跟随正在创建的文件。
用日志文件尝试一下。
例如 tail -f /var/log/messages。
您将看到日志文件输出到控制台,就像它们出现在日志中一样。
答案3
管道、Tee 和 Tail(Tee 是问题的核心,因为它复制了标准输出。如果 sed 是您用来解析数据的文件,则示例如下:
kbrandt@k$ a=0; while [[ a -lt 10 ]]; do
> echo foo; a=$(( $a + 1));
> done | tee -a unprocessed | sed 's/foo/bar/' > processed
kbrandt@kbrandt$ cat unprocessed
foo
foo
foo
...
kbrandt@kbrandt$ cat processed
bar
bar
...
然后,您可以将其作为一项作业运行并进行尾部处理,或者只是tail -f processed
在另一个窗口中运行。
答案4
使用尾部并将其导入到您的解析器中。