कई उपयोगिताओं हैं जो आपको एक दर निर्दिष्ट करते हैं, जैसे pv
, लेकिन यह प्रति सेकंड बाइट्स में दर है, प्रति सेकंड लाइनें नहीं।
लेकिन अगर आप वास्तव में lps का उपयोग करना चाहते हैं, तो आप ऐसा कर सकते हैं:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
पर्ल के तहत, स्विच print while <>
द्वारा प्रतिस्थापित किया जा सकता है -p
:
perl -pe 'select undef,undef,undef,.00333'
कोशिश करते हैं:
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
स्पष्टीकरण:
300 लाइनों / सेकंड का मतलब 1 लाइन 0.0033333333 सेकंड्स से है।
print
बिना तर्क प्रिंट $_
जो डिफ़ॉल्ट इनपुट स्पेस है ।
जैसा कि कहा जाता है ... | perl -e
, ... | perl -ne
या ... | perl -pe
, मानक इनपुट को स्वचालित रूप से असाइन किया जाएगा *STDIN
जिसे डिफ़ॉल्ट फ़ाइल डिस्क्रिप्टर को सौंपा गया है , इसलिए <>
वही <STDIN>
करेगा जो मानक इनपुट से पढ़ेगा जब तक $/
( इनपुट रिकॉर्ड विभाजक जो डिफ़ॉल्ट रूप से एक नई रेखा है ) तक पहुंच जाएगा। अंग्रेजी में, डिफ़ॉल्ट रूप से मानक इनपुट से एक पंक्ति <>
पढ़ेंगे और सामग्री को चर में असाइन करेंगे ।$_
&&
एक है और एक शर्त है, लेकिन वहाँ एक श्रृंखला कमांड विभाजक के रूप में प्रयोग किया जाता है ताकि (सफलतापूर्वक) एक पंक्ति प्रिंट, अगले आदेश कर रही है।
select
उपयोग नहीं करने के लिएsleep
एक प्रोग्रामर की चाल है । यह कमांड फ़ाइल डिस्क्रिप्टर (इनपुट और / या आउटपुट, फाइल, सॉकेट और / या नेट सॉकेट) पर घटनाओं को फंसाने के लिए बनाया गया है । इस आदेश के साथ, एक कार्यक्रम 3 तरह की घटनाओं की प्रतीक्षा कर सकता है , पढ़ने के लिए तैयार फ़ीड , लिखने के लिए तैयार फ़ीड और कुछ घटना फ़ीड पर हुई । चौथा तर्क सेकंड में टाइमआउट है, इसलिए वाक्यविन्यास है select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
।
अधिक सटीकता के लिए, आप Time::Hires
पर्ल मॉड्यूल का उपयोग कर सकते हैं :
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
नोट: $.
है वर्तमान इनपुट लाइन नंबर ।
के रूप में बेहतर लिखा है 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 <>
उपयोग:
catLps.pl [lps] [file] [file]...
पहला तर्क lps
प्रति सेकंड संख्यात्मक लाइन के लिए वैकल्पिक लाइन है (डिफ़ॉल्ट: 300)
नोट: यदि फ़ाइल नाम केवल संख्यात्मक है, तो आपको उन्हें पथ के साथ निर्दिष्ट करना पड़ सकता है ./3
:।
जैसे cat
यह तर्क और / या मानक इनपुट के रूप में दी गई फ़ाइलों को पारित कर सकता है
तो हम कर सकते हैं:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
मजे के लिए:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q
। सीमा प्रति सेकंड बाइट्स में है, प्रति सेकंड लाइनें नहीं है, इसलिए मैं यह एक टिप्पणी कर रहा हूं जवाब नहीं।