สั้นและอ่านได้ :
perl -pe "system 'sleep .003'" log.txt
ฉันโพสต์คำตอบนี้เพราะพวกมันเล็กและอ่านง่ายเพราะความเห็นของคำตอบของ DMasดูเหมือนจะส่งเสริมการแก้ปัญหาแบบนี้!
แต่ฉันเกลียดนี้เพราะ: สำหรับระยะนี้ Perl จะแยกไป/bin/sleep
300x / วินาที!
นี่คือผู้บริโภคทรัพยากรรายใหญ่! ยังเป็นทางออกที่ดีผิด!!
การใช้builtin sleep ในperl
โชคไม่ดีที่ builtin sleep
จำกัด จำนวนเต็ม ดังนั้นเราต้องใช้select
แทน:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
ภายใต้ Perl 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>
ที่จะอ่านจากอินพุตมาตรฐานจนกระทั่ง$/
( ตัวคั่นเร็กคอร์ดอินพุตซึ่งเป็นค่าเริ่มต้นขึ้นบรรทัดใหม่ ) ในภาษาอังกฤษโดยค่าเริ่มต้น<>
จะอ่านหนึ่งบรรทัดจากอินพุตมาตรฐานและกำหนดเนื้อหาให้กับ$_
ตัวแปร
&&
เป็นและเงื่อนไข แต่ใช้ที่นั่นเป็นตัวคั่นคำสั่ง chainดังนั้นหลังจาก (สำเร็จ) พิมพ์หนึ่งบรรทัดโดยทำคำสั่งถัดไป
select
เป็นเคล็ดลับของโปรแกรมเมอร์ที่จะไม่ใช้ sleep
คำสั่งนี้ถูกออกแบบมาเพื่อดักจับเหตุการณ์ในfile descriptor (อินพุตและ / หรือเอาต์พุตไฟล์ซ็อกเก็ตและ / หรือซ็อกเก็ตสุทธิ) ด้วยคำสั่งนี้โปรแกรมจะรอ 3 ชนิดของกิจกรรม, อาหารพร้อมที่จะอ่าน , อาหารพร้อมที่จะเขียนและเหตุการณ์บางอย่างที่เกิดขึ้นในฟีด select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
อาร์กิวเมนต์ที่สี่คือหมดเวลาในวินาทีดังนั้นไวยากรณ์
เพื่อความแม่นยำมากขึ้นคุณสามารถใช้Time::Hires
โมดูล perl:
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)
หมายเหตุ: ถ้าชื่อไฟล์เป็นตัวเลขเท่านั้นคุณอาจจะต้อง specifiy ./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
ลองสิ่งที่ต้องการ ขีด จำกัด อยู่ในหน่วยไบต์ต่อวินาทีไม่ใช่บรรทัดต่อวินาทีดังนั้นฉันจึงทำให้ความคิดเห็นนี้ไม่ใช่คำตอบ