Короткий та читаний :
perl -pe "system 'sleep .003'" log.txt
Я публікую ці рішення, оскільки вони невеликі та читаються, оскільки коментарі відповіді DMas сприяють такому рішенню!
Але я ненавиджу це тому, що: для цього запуску perl буде розвиватись до /bin/sleep300x / секунд!
Це великий споживач ресурсів! Також неправильно хороші рішення !!
Використання вбудованого сну в перл
На жаль, вбудований 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, стандартне введення буде автоматичні присвоєний , *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)
Примітка: якщо ім'я файлу тільки числові, ви , можливо , доведеться 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))
cat FILENAME | pv -l -L 900 -q. Ліміт - в байтах на секунду, а не у рядках на секунду, тому я роблю це коментарем, а не відповіддю.