Kısa ve okunabilir :
perl -pe "system 'sleep .003'" log.txt
Bu çözümleri gönderiyorum , çünkü DMas'ın cevabının yorumları bu tür bir çözümü teşvik ediyor gibi küçük ve okunabilirler !
Bu çalışma için, perl olacaktır: Ama bu, çünkü nefret çatal için /bin/sleep
300x / saniye!
Bu büyük kaynak kaynağı! Ayrıca yanlış iyi çözümler !!
Perl'de yerleşik uyku kullanma
Ne yazık ki, yerleşik sleep
tamsayılarla sınırlıdır. Bunun select
yerine şunu kullanmalıyız :
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Perl altında print while <>
, -p
anahtar ile değiştirilebilir :
perl -pe 'select undef,undef,undef,.00333'
Hadi deneyelim:
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
Açıklama:
300 satır / sn, 1 satır 0.0033333333 saniye anlamına gelir.
print
argüman baskılar olmadan $_
hangi varsayılan giriş alanı .
olarak adlandırılan ... | perl -e
, ... | perl -ne
veya ... | perl -pe
standart girdi otomatik olarak tayin edileceğini, *STDIN
olduğu varsayılan dosya tanımlayıcı yüzden, <>
aynı yapacağını <STDIN>
kadar standart girdiden okuyacaktır hangi $/
( giriş kayıt ayırıcı varsayılan olarak ise satır ulaşılacaktır). İngilizce olarak, varsayılan olarak standart girişten bir satır <>
okuyacak ve değişkene içerik atayacaktır .$_
&&
bir ve koşuludur, ancak burada bir zincir komut ayırıcısı olarak kullanılır, bu nedenle bir satır (başarıyla) yazdırdıktan sonra bir sonraki komutu yapar.
select
kullanmamak için bir programcının hilesisleep
. Bu komut, dosya tanımlayıcılarındaki (girişler ve / veya çıkışlar, dosyalar, soket ve / veya ağ yuvaları) olayları yakalamak için tasarlanmıştır . Bu komutla, bir program 3 tür olayı bekleyebilir , beslemeye okumaya hazır , yem yazmaya hazır olabilir ve yemde bazı olaylar olabilir . Dördüncü argüman saniye cinsinden bir zaman aşımıdır, yani sözdizimi select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
.
Daha fazla hassasiyet için Time::Hires
perl modülünü kullanabilirsiniz :
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
Not: $.
bir akım giriş hattı sayısı .
Olarak daha iyi yazılmış 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 <>
Kullanımı:
catLps.pl [lps] [file] [file]...
İlk bağımsız değişken lps
, saniye başına isteğe bağlı satır sayısal bağımsız değişkenidir (varsayılan: 300)
Not: Dosya adı yalnızca sayısalsa, bunları path: ile belirtmeniz gerekebilir ./3
.
Gibi cat
bu argüman ve / veya verilen dosyaları geçebileceği standart girdi
Böylece yapabiliriz:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Eğlence için:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q
. Sınır saniyede bayt değil, saniyede bayt cinsinden, bu yüzden bunu bir cevap değil bir yorum yapıyorum.