我很懒,我可以编写一个脚本来做到这一点,但我甚至懒得去想如何去做。
我经常会做这样的事情:
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/sleep
300次/秒!
这是一个很大的资源消耗者!也是一个错误好的解决方案!!
使用内置睡懒觉perl
不幸的是,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::Hires
perl 模块:
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