Короткий та читаний :
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
, стандартне введення буде автоматичні присвоєний , *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
. Ліміт - в байтах на секунду, а не у рядках на секунду, тому я роблю це коментарем, а не відповіддю.