Ada beberapa utilitas yang memungkinkan Anda menentukan tarif, seperti pv
, tapi kecepatannya dalam byte per detik, bukan garis per detik.
Tetapi jika Anda benar-benar ingin menggunakan lps, Anda bisa melakukan ini:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Di bawah perl, print while <>
dapat diganti oleh -p
beralih:
perl -pe 'select undef,undef,undef,.00333'
Mari mencoba:
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
Penjelasan:
300 baris / detik berarti 1 baris dengan 0,0033333333 detik.
print
tanpa cetakan argumen $_
yang mana ruang input default .
disebut sebagai ... | perl -e
, ... | perl -ne
atau ... | perl -pe
, input standar akan secara otomatis ditetapkan *STDIN
yang mana deskriptor file default jadi <>
akan melakukan hal yang sama seperti <STDIN>
yang akan membaca dari input standar hingga $/
( input pemisah rekaman yang secara default a garis baru ) akan tercapai. Dalam bahasa Inggris, secara default <>
akan membaca satu baris dari input standar dan menetapkan konten ke $_
variabel.
&&
adalah dan kondisi, tetapi digunakan di sana sebagai pemisah perintah rantai jadi setelah (berhasil) mencetak satu baris, lakukan perintah berikutnya.
select
adalah Trik programmer untuk tidak menggunakan sleep
. Perintah ini dirancang untuk menjebak peristiwa deskriptor file (input dan / atau output, file, soket dan / atau soket net). Dengan perintah ini, sebuah program bisa Tunggu untuk 3 jenis acara, feed siap dibaca , feed siap untuk ditulis dan beberapa peristiwa terjadi saat makan . Argumen keempat adalah batas waktu dalam detik, jadi sintaksnya adalah select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
.
Untuk lebih presisi, Anda bisa menggunakannya Time::Hires
modul perl:
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
catatan: $.
aku s nomor jalur input saat ini .
Lebih baik ditulis sebagai 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 <>
Pemakaian:
catLps.pl [lps] [file] [file]...
Argumen pertama lps
adalah baris opsional per detik argumen numerik (default: 300)
Catatan: jika nama file hanya numerik, Anda mungkin harus menentukannya dengan path: ./3
.
Seperti cat
ini dapat meneruskan file yang diberikan sebagai argumen dan / atau input standar
Jadi kita bisa:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Untuk kesenangan:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q
. Batasnya adalah dalam byte per detik, bukan garis per detik, jadi saya membuat ini sebagai komentar, bukan jawaban.