简短易读:
perl -pe "system 'sleep .003'" log.txt
我发布此解决方案是因为它们很小且易于阅读,因为DMas答案的注释似乎促进了这种解决方案!
但是我讨厌这个,因为:对于此运行,perl将分叉到/bin/sleep
300x /秒!
这是一个很大的资源消耗者!也是一个错误的好的解决方案!
不幸的是,内置sleep
函数仅限于整数。因此,我们必须使用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行/秒表示1行乘0.0033333333秒。
print
不带参数的输出$_
是默认输入空间。
被称为... | perl -e
,... | perl -ne
或者... | perl -pe
,标准输入将automaticaly分配到*STDIN
这是默认的文件描述符,所以<>
会做同样的<STDIN>
,这将从标准输入读取,直到$/
(输入记录分隔符默认情况下是一个换行符)将达到。在英语中,默认情况下<>
会读一个从标准输入和分配内容系$_
变量。
&&
是and条件,但在那里用作链命令分隔符,因此(成功)打印一行后,执行下一条命令。
select
是程序员不使用的技巧sleep
。此命令旨在捕获文件描述符(输入和/或输出,文件,套接字和/或网络套接字)上的事件。使用此命令,程序可以等待 3种事件,即feed可以读取,feed可以写入以及feed上发生了一些事件。第四个参数是超时(以秒为单位),因此语法为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)
注意:如果filename仅是数字,则可能必须使用path:指定它们./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))
cat FILENAME | pv -l -L 900 -q
。限制以每秒字节数为单位,而不是以每秒行数为单位,因此,我将其设为注释而不是答案。