Есть несколько утилит, которые позволяют вам указать скорость, например, pv , но это скорость в байтах в секунду, а не в линиях в секунду.
Но если вы действительно хотите использовать lps, вы можете сделать это:
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, стандартный ввод будет автоматически назначен на- *STDINкоторый является файловым дескриптором по умолчанию , поэтому- <>будет делать то же самое, что и- <STDIN>который будет читать со стандартного ввода до- $/(разделитель входных записей, который по умолчанию является новой строкой) будет достигнуто. На английском языке по умолчанию- <>будет читать одну строку из стандартного ввода и назначать содержимое переменной- $_.
 
- &&это и условие, но используются там в качестве командной цепи разделителя после (успешно) напечатать одну строку, делая следующую команду.
 
- select- хитрость программиста, чтобы не использовать- sleep. Эта команда предназначена для перехвата событий в файловых дескрипторах (входные и / или выходные данные, файлы, сокеты и / или сетевые сокеты). С помощью этой команды программа может ожидать 3 вида событий, канал готов к чтению , канал готов к записи, а некоторые события происходят в канале. Четвертый аргумент - это тайм-аут в секундах, поэтому синтаксис:- select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>.
 
Для большей точности вы можете использовать Perl-модуль Time::Hires :
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)
  
  Примечание: если имя файла только числовые, вы , возможно , придется specifiy их с ./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))