以特定的每秒行数速度将文件传输到终端

以特定的每秒行数速度将文件传输到终端

我很懒,我可以编写一个脚本来做到这一点,但我甚至懒得去想如何去做。

我经常会做这样的事情:

cris$ python runexperiment.py > output.txt
cris$ cat output.txt

有时,在查看实验的长输出时,我喜欢让页面滚动并观察连续模式的形成和分散。但使用 cat 处理包含 100 万行的文件大约需要 5 秒。这对我来说太快了。

有什么方法可以减慢查看文件的速度,比如使用“滚动实用程序”?我想要快速,但不是每秒 200k 行(所有这些都可能被显示器记录下来)。

就像是

cris$ scroll -lps=300 output.txt

然后坐下来观看每秒 300 行的数据滚过,我想这将是理想的。

答案1

简短而可读

perl -pe "system 'sleep .003'" log.txt

我发布这些解决方案是因为它们很小而且易读,正如DMas 的回答似乎推广这种解决方案!

但我讨厌这样,因为:对于这次运行,perl 将达到/bin/sleep300次/秒!

这是一个很大的资源消耗者!也是一个错误好的解决方案!!

使用内置睡懒觉

不幸的是,builtinsleep仅限于整数。所以我们必须改用select

perl -e 'print && select undef,undef,undef,.00333 while <>;'

在 perl 下,print while <>可以用以下-p开关替换:

perl -pe 'select undef,undef,undef,.00333'

咱们试试吧:

time /bin/ls -l /usr/bin | perl -pe 'select undef,undef,undef,.00333' | wc
   2667   24902  171131

real    0m9.173s
user    0m0.056s
sys     0m0.048s

bc -l < <(echo 2667/9.173)
290.74457647443584432573

解释:

  • 300 行/秒意味着 0.0033333333 秒显示 1 行。

  • print不带参数打印$_的是默认输入空间

  • 称为... | perl -e... | perl -ne... | perl -pe,标准输入将自动分配给*STDIN哪个是默认文件描述符,因此将执行的操作与从标准输入读取的操作<>相同,直到(<STDIN>$/输入记录分隔符默认情况下新队)将达到。在英语中,默认情况下<>将读为从标准输入中取行并将内容分配给$_变量。

  • &&是一个条件,但在那里用作链式命令分隔符因此在(成功)打印一行后,执行下一个命令。

  • select程序员不要使用的技巧sleep。此命令旨在捕获事件文件描述符(输入和/或输出、文件、套接字和/或网络套接字)。使用此命令,程序可以等待对于三种事件,提要已准备好阅读提要已准备好写入动态中发生了一些事件。第四个参数是超时时间(秒),因此语法是select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>

为了更精确,您可以使用Time::Hiresperl 模块:

perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'

注:$.当前输入行号

更好的写法是cat >catLps.pl

#!/usr/bin/perl -w

use strict;
use Time::HiRes qw|time|;

my $start=time;
my $lps=300;

$lps=shift @ARGV if @ARGV && $ARGV[0]=~/^(\d+)$/;
my $sleepPerLine=1/$lps;

print &&
    select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)
    while <>

用法:

catLps.pl [lps] [file] [file]...

第一个参数lps是可选的每秒行数数字参数(默认值:300)

注意:如果文件名只是数字,您可能必须使用路径指定它们:./3

cat这样可以传递作为参数给出的文件和/或标准输入

因此我们可以:

TIMEFORMAT='%R' 
time seq 1 100 | ./catLps.pl 100 >/dev/null 
1.040

time seq 1 10000 | ./catLps.pl 10000 >/dev/null  
1.042

为了娱乐:

export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))

答案2

只需将 awk 与 sleep 结合使用:

awk '{print $0; system("sleep .1");}' log.txt

答案3

您可以使用专门制作的工具,而不是使用解释器。它可能安装在您的发行版上,或者您可以安装它(apt-get install pv,等等)。

以每秒 5 行的速度显示文件:

cat filename | pv --quiet --line-mode --rate-limit 5

以每秒 100 字节的速度显示文件:

cat filename| pv --quiet  --rate-limit 100

答案4

Ruby 的sleep函数支持浮点值,因此这里有一个基于@F.Hauri 的答案的有效而简短的解决方案:

ruby -pe 'sleep 0.00333' log.txt

或者

ruby -pe 'sleep (1.0/300)' log.txt

相关内容