Kurz und lesbar :
perl -pe "system 'sleep .003'" log.txt
Ich poste diese Lösungen, weil sie klein und lesbar sind, da Kommentare der Antwort von DMas diese Art von Lösung zu fördern scheinen!
Aber ich hasse es , weil: Für diesen Lauf, perl wird Gabel zu /bin/sleep
300x / Sekunden!
Dies ist ein großer Ressourcenverbraucher! Auch eine falsche gute Lösung !!
Mit eingebautem Schlaf in Perl
Leider ist Builtin sleep
auf ganze Zahlen beschränkt. Also müssen wir select
stattdessen verwenden:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Unter Perl print while <>
könnte durch den -p
Schalter ersetzt werden:
perl -pe 'select undef,undef,undef,.00333'
Lass es uns versuchen:
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
Erläuterung:
300 Zeilen / Sek. Bedeutet 1 Zeile pro 0,0033333333 Sekunden.
print
ohne Argument wird gedruckt, $_
was der Standardeingabebereich ist .
genannt , wie ... | perl -e
, ... | perl -ne
oder ... | perl -pe
würde die Standardeingabe automatisch zugewiesen werden , *STDIN
was Standard Dateideskriptor , also <>
das gleiche tun würde , wie <STDIN>
die von der Standardeingabe bis gelesen wird $/
( Eingangsdatensatztrennzeichen, das eine standardmäßig ist Neue - Zeile ) erreicht wird. In Englisch wird standardmäßig eine Zeile aus der Standardeingabe <>
gelesen und der Variablen Inhalt zugewiesen .$_
&&
ist eine und -Bedingung, wird dort jedoch als Trennzeichen für Kettenbefehle verwendet, sodass nach (erfolgreichem) Drucken einer Zeile der nächste Befehl ausgeführt wird.
select
ist ein Tricksleep
eines Programmierers, den man nicht benutzt . Dieser Befehl dient zum Abfangen von Ereignissen in Dateideskriptoren (Ein- und / oder Ausgänge, Dateien, Sockets und / oder Net-Sockets). Mit diesem Befehl kann ein Programm auf drei Arten von Ereignissen warten : Feed bereit zum Lesen , Feed bereit zum Schreiben und ein Ereignis ist im Feed aufgetreten . Das vierte Argument ist eine Zeitüberschreitung in Sekunden, die Syntax also select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
.
Für mehr Präzision können Sie das Time::Hires
Perl-Modul verwenden:
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
Hinweis: $.
ist die aktuelle Eingabezeilennummer .
Besser geschrieben als 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 <>
Verwendung:
catLps.pl [lps] [file] [file]...
Das erste Argument lps
ist ein optionales numerisches Argument für Zeile pro Sekunde (Standard: 300).
Hinweis: Wenn der Dateiname nur numerisch ist, müssen Sie ihn möglicherweise mit dem folgenden Pfad angeben : ./3
.
Auf cat
diese Weise könnten Dateien übergeben werden, die als Argument und / oder Standardeingabe angegeben wurden
So konnten wir:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Zum Spass:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q
. Die Grenze liegt in Bytes pro Sekunde, nicht in Zeilen pro Sekunde, daher mache ich dies zu einem Kommentar und nicht zu einer Antwort.