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.