Krótki i czytelny :
perl -pe "system 'sleep .003'" log.txt
Publikuję te rozwiązania, ponieważ są one małe i czytelne, ponieważ komentarze do odpowiedzi DMas wydają się promować takie rozwiązanie!
Ale nienawidzę tego powodu: W tym okresie, Perl będzie bulić do /bin/sleep300x / sek!
To duży konsument zasobów! Również złe dobre rozwiązania !!
Korzystanie z wbudowanego trybu uśpienia w Perlu
Niestety, wbudowane sleepjest ograniczone do liczb całkowitych. selectZamiast tego musimy użyć :
perl -e 'print && select undef,undef,undef,.00333 while <>;'
W Perlu print while <>można zastąpić -pprzełącznikiem:
perl -pe 'select undef,undef,undef,.00333'
Spróbujmy:
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
Wyjaśnienie:
300 linii / sek oznacza 1 linię o 0,0033333333 sek.
printbez argumentów, $_które są domyślną przestrzenią wejściową .
wywoływane jako ... | perl -e, ... | perl -nelub ... | perl -peautomatycznie zostanie przypisane standardowe wejście, do *STDINktórego jest domyślny deskryptor pliku , więc <>zrobi to samo, <STDIN>co odczytane ze standardowego wejścia, dopóki nie zostanie osiągnięty $/( separator rekordów wejściowych, który jest domyślnie nowy wiersz ). W języku angielskim domyślnie <>odczytuje jeden wiersz ze standardowego wejścia i przypisuje zawartość do $_zmiennej.
&&jest warunkiem i , ale jest tam stosowany jako separator poleceń łańcuchowych, więc po (pomyślnym) wydrukowaniu jednego wiersza i wykonaniu następnego polecenia.
selectto sztuczka programisty, której nie należy używaćsleep . To polecenie służy do przechwytywania zdarzeń na deskryptorach plików (wejścia i / lub wyjścia, pliki, gniazda i / lub gniazda sieciowe). Za pomocą tego polecenia program może czekać na 3 rodzaje zdarzeń, kanał gotowy do odczytu , kanał gotowy do zapisu i pewne zdarzenie wydarzyło się podczas kanału . Czwarty argument to limit czasu w sekundach, więc składnia jest select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>.
Dla większej precyzji możesz użyć Time::Hiresmodułu perl:
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
Uwaga: $.jest bieżącym numerem linii wejściowej .
Lepiej napisane jako 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 <>
Stosowanie:
catLps.pl [lps] [file] [file]...
Pierwszy argument lpsto opcjonalny argument liczbowy na sekundę (domyślnie: 300)
Uwaga: Jeśli nazwa pliku jest tylko numeryczny, być może trzeba będzie specifiy je ze ścieżką: ./3.
W catten sposób można przekazać pliki podane jako argument i / lub standardowe dane wejściowe
Abyśmy mogli:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Dla zabawy:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q. Limit jest w bajtach na sekundę, a nie liniach na sekundę, więc robię z tego komentarz, a nie odpowiedź.