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/sleep300x / 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 sleepest limitée aux nombres entiers. Nous devons donc utiliser à la selectplace:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Sous perl, print while <>pourrait être remplacé par le -pswitch:
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.
printsans argument imprime $_qui est l'espace d'entrée par défaut .
appelé comme ... | perl -e, ... | perl -neou ... | perl -pe, l'entrée standard serait automatiquement affectée à *STDINquel 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.
selectest 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::Hiresmodule 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 lpsest 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 catcela 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.