Court et lisible :
perl -pe "system 'sleep .003'" log.txt
Je poste ces solutions car elles sont petites et lisibles, car les commentaires de la réponse de DMas semblent promouvoir ce type de solution!
Mais je déteste ça parce que: pour cette course, perl va bifurquer à /bin/sleep
300x / secondes!
C'est un gros consommateur de ressources! Aussi une mauvaise bonne solution !!
Utilisation du sommeil intégré en perl
Malheureusement, la fonction intégrée sleep
est limitée aux nombres entiers. Nous devons donc utiliser à la select
place:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Sous perl, print while <>
pourrait être remplacé par le -p
switch:
perl -pe 'select undef,undef,undef,.00333'
Essayons:
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
Explication:
300 lignes / s signifie 1 ligne par 0,0033333333 s.
print
sans argument imprime $_
qui est l'espace d'entrée par défaut .
appelé comme ... | perl -e
, ... | perl -ne
ou ... | perl -pe
, l'entrée standard serait automatiquement affectée à *STDIN
quel est le descripteur de fichier par défaut , <>
ferait de même que celui <STDIN>
qui lira à partir de l'entrée standard jusqu'à ce que $/
( séparateur d'enregistrement d'entrée qui est par défaut une nouvelle ligne ) soit atteint. En anglais, par défaut <>
, lira une ligne de l'entrée standard et attribuera le contenu à la $_
variable.
&&
est une condition et , mais y est utilisé comme séparateur de commande de chaîne, donc après (avec succès) imprimer une ligne, en exécutant la commande suivante.
select
est une astuce de programmeur à ne pas utilisersleep
. Cette commande est conçue pour intercepter les événements sur les descripteurs de fichiers (entrées et / ou sorties, fichiers, socket et / ou net sockets). Avec cette commande, un programme peut attendre 3 types d'événements, un flux prêt à lire , un flux prêt à écrire et un événement s'est produit sur le flux . Le quatrième argument est un délai d'expiration en secondes, la syntaxe l'est donc select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
.
Pour plus de précision, vous pouvez utiliser le Time::Hires
module perl:
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
Remarque: $.
est le numéro de ligne d'entrée actuel .
Mieux écrit comme 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 <>
Usage:
catLps.pl [lps] [file] [file]...
Le premier argument lps
est un argument numérique optionnel de ligne par seconde (par défaut: 300)
Remarque: si le nom de fichier est uniquement numérique, vous pouvez avoir les specifiy avec le chemin: ./3
.
Comme cat
cela pourrait passer des fichiers donnés comme argument et / ou entrée standard
Nous pourrions donc:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Pour s'amuser:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q
. La limite est en octets par seconde, pas en lignes par seconde, donc j'en fais un commentaire et non une réponse.