Коротко и читабельно :
perl -pe "system 'sleep .003'" log.txt
Я публикую эти решения, потому что они маленькие и удобочитаемые, так как комментарии к ответу DMas, кажется, способствуют решению такого рода!
Но я ненавижу это, потому что: для этого запуска perl разветвляется до /bin/sleep
300x / секунд!
Это большой потребитель ресурсов! Также неправильно хорошие решения !
Использование встроенного сна в Perl
К сожалению, встроенная функция 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
. Эта команда предназначена для захвата событий в файловых дескрипторах (входные и / или выходные данные, файлы, сокеты и / или сетевые сокеты). С помощью этой команды программа может ожидать 3 вида событий, канал готов к чтению , канал готов к записи, и какое-то событие происходит в канале . Четвертый аргумент - это время ожидания в секундах, поэтому синтаксис таков 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
. Ограничение в байтах в секунду, а не строк в секунду, поэтому я делаю этот комментарий, а не ответ.