我有一个程序将持续运行,将输出写入标准输出,我想不断地从中获取最后一组输出并将其写入文件。每次出现一组新的输出时,我都想覆盖同一个文件。
一个示例是以下命令:
iostat -xkd 5
每 5 秒打印一些输出,每个输出后都有一个空行。我希望将最后一个“集合”写入文件,我认为这应该可以通过一些简单的方法来实现。
到目前为止,我已经尝试过使用 xargs,我只能用一行来做到这一点,而不是一组由某些东西分隔的行。
我认为使用 awk 可能是可行的,但我不知道如何让它在数据传输过程中缓冲数据,以便它可以使用系统将其写出,或者让它关闭并重新打开同一个输出文件。
编辑:为了澄清,这是一个将连续运行的命令。我不想启动一个新命令并阅读它的输出。
解决方案
我改编了@Bittrance 的答案以获得以下信息:
iostat -xkd 5 | (while read r; do
if [ -z "$r" ]; then
mv -f /tmp/foo.out.tmp /tmp/foo.out
else
echo "$r" >> /tmp/foo.out.tmp
fi
done)
这基本上是相同的,除了检测“节”的结尾并写入临时文件以便每当外部进程尝试读取输出文件时它就会完成。