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/sleep
300x / sek!
To duży konsument zasobów! Również złe dobre rozwiązania !!
Korzystanie z wbudowanego trybu uśpienia w Perlu
Niestety, wbudowane sleep
jest ograniczone do liczb całkowitych. select
Zamiast tego musimy użyć :
perl -e 'print && select undef,undef,undef,.00333 while <>;'
W Perlu print while <>
można zastąpić -p
przełą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.
print
bez argumentów, $_
które są domyślną przestrzenią wejściową .
wywoływane jako ... | perl -e
, ... | perl -ne
lub ... | perl -pe
automatycznie zostanie przypisane standardowe wejście, do *STDIN
któ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.
select
to 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::Hires
moduł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 lps
to 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 cat
ten 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ź.