Existem vários utilitários que permitem especificar uma taxa, como pv , mas é a taxa em bytes por segundo, não linhas por segundo.
Mas se você realmente quiser usar o lps, você pode fazer isso:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Em perl, print while <> pode ser substituído pela opção -p :
perl -pe 'select undef,undef,undef,.00333'
Vamos tentar:
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
Explicação:
-
300 linhas / seg. 1 linha por 0,0033333333 seg.
-
printsem argumento imprime$_, que é espaço de entrada padrão . -
chamado como
... | perl -e,... | perl -neou... | perl -pe, a entrada padrão seria atribuída automaticamente a*STDIN, que é descritor de arquivo padrão , portanto,<>faria o o mesmo que<STDIN>, que lerá da entrada padrão até que$/( registro de registro , que é por padrão uma nova linha ) seja alcançado. Em inglês, por padrão,<>lerá a linha um da entrada padrão e atribuirá o conteúdo à variável$_. -
&&é uma condição e , mas é usado como um separador de comando de cadeia , assim após (com êxito) imprimir uma linha, executando o próximo comando. -
selecté um truque do programador para não usarsleep. Este comando é projetado para interceptar eventos em descritores de arquivos (entradas e / ou saídas, arquivos, soquetes e / ou soquetes de rede). Com este comando, um programa poderia esperar por 3 tipos de eventos, feed pronto para ler , feed pronto para gravar e algum evento aconteceu no feed . O quarto argumento é um tempo limite em segundos, portanto, a sintaxe éselect <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>.
Para mais precisão, você pode usar o módulo Time::Hires perl:
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
Nota: $. é número da linha de entrada atual .
Melhor escrito como 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 <>
Uso:
catLps.pl [lps] [file] [file]...First argument
lpsis optional line per seconds numeric argument (default: 300)Note: if filename is only numeric, you may have to specifiy them with path:
./3.Like
catthis could pass files given as argument and/or standard input
Então poderíamos:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Para diversão:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))