我正在使用pv实用程序来评估日志文件中添加的日志条目的速度,如下所示:
tail -f -n 0 mylog.log | pv -lr -t -i 5 > /dev/null
这将输出加速并每5秒刷新一次:
0:00:05 [ 10/s]
现在,我想将当前值(“10”)重定向到文件并每隔5秒刷新一次。不附加它,只是覆盖文件中的先前值。 有关如何重定向到文件的任何想法?我是unix的新手,还没有工作。
谢谢!
答案 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是有问题的。你可以使用bc
或dc
来获得更高的精确度,但是你甚至可以更好地做减法,只需每隔几秒就将总行数写入文件。
答案 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 中有很多方法可以做到这一点,包括 tr
、sed
、awk
,甚至 dos2unix
变体之一(我认为它是 mac2unix
或dos2unix -c mac
)。
如果你安装了 perl,下面的一行会将 pv-output-file 的每一行打印在单独的一行上。
perl -pe 's/\r/\n/g' pv-output-file
您可以将其输出重定向到文本查看器(如 less
或 more
)以滚动浏览行。如果您只想将其“修复”到位,请执行上述 perl -pi -e [...]
。