将pv输出重定向到文件

时间:2013-12-27 13:12:17

标签: linux file unix command-line-interface progress

我正在使用pv实用程序来评估日志文件中添加的日志条目的速度,如下所示:

tail -f -n 0 mylog.log | pv -lr -t -i 5 > /dev/null

这将输出加速并每5秒刷新一次:

0:00:05 [  10/s]

现在,我想将当前值(“10”)重定向到文件并每隔5秒刷新一次。不附加它,只是覆盖文件中的先前值。 有关如何重定向到文件的任何想法?我是unix的新手,还没有工作。

谢谢!

4 个答案:

答案 0 :(得分:4)

由于无法添加评论,我想跟进this one

使用-f上的pv标志强制将其输出到文件中。

  

-f, - force   强制输出。通常,如果标准错误不是终端,pv将不会输出任何视觉显示。此选项强制它执行此操作。

e.g。 tail -f -n 0 mylog.log | pv -lrf -t -i 5 > /dev/null 2> output-file

答案 1 :(得分:2)

pv正在将其诊断信息写入stderr,因此您可以从:

开始
tail -f -n 0 mylog.log | pv -lr -t -i 5 > /dev/null 2> output-file

这只会附加,因此输出文件将以所有数据结束,其中行以回车符结束而没有换行符。 (我现在无法访问pv,所以这都是猜想。)要获得所需的数据,请尝试一些简单的后处理:

tail -f mylog.log | pv -lr -t -i 5 2>&1 > /dev/null | 
  tr /\\r \ \\n | tr -d [] | while read stamp value;
  do echo $value > output-file; done

上面的shell技术允许您将stderr引导到管道中进行后处理。像你正在做的那样使用尾巴有点奇怪,并且光伏对此有点过分。如果你有这么长的延迟(5秒是时间),那么在每次迭代中使用wc并进行减法可能是可以接受的:

echo 0 > output-file
while sleep 5; do
    expr $(wc -l < mylog.log) - $(cat output-file) > output-file
done

请注意,这会打印超过5秒的差异,而不是每秒的速率。 expr不能很好地处理非整数运算,因此除以5是有问题的。你可以使用bcdc来获得更高的精确度,但是你甚至可以更好地做减法,只需每隔几秒就将总行数写入文件。

答案 2 :(得分:1)

如果文件的字节数是OK而不是行数,则可以执行以下操作:

while true; do
  ls -s --block-size=1 mylog.log > output-file
  sleep 5
end

这比使用PV更有效。 “pv”命令通过复制日志中的所有字节来烧掉大量CPU。

答案 3 :(得分:0)

其他答案告诉了如何让 pv 保存到文件,但有些不完整。 pv\r(回车或 CR)而不是 \n(换行符)终止每个记录的行。例如,如果您使用 cat pv-output-file,它不会将每一行单独打印到屏幕上,而是会打印每一行,然后几乎立即覆盖它。 more 似乎表现得更好一些,但仍然不是很好,并且 less 会给你整个 pv 日志在一行呈现的一行 ^M 在每行的结尾应该是什么。

为了让它在文本查看器中呈现良好的效果,您仍然需要做一些事情来将 CR 转换为换行符。在 unix 中有很多方法可以做到这一点,包括 trsedawk,甚至 dos2unix 变体之一(我认为它是 mac2unixdos2unix -c mac)。

如果你安装了 perl,下面的一行会将 pv-output-file 的每一行打印在单独的一行上。

perl -pe 's/\r/\n/g' pv-output-file

您可以将其输出重定向到文本查看器(如 lessmore)以滚动浏览行。如果您只想将其“修复”到位,请执行上述 perl -pi -e [...]