Ngắn gọn và dễ đọc :
perl -pe "system 'sleep .003'" log.txt
Tôi đăng giải pháp này vì chúng nhỏ và dễ đọc, vì nhận xét về câu trả lời của DMas dường như thúc đẩy loại giải pháp này!
Nhưng tôi ghét điều này bởi vì: Đối với lần chạy này, perl sẽ rẽ nhánh tới /bin/sleep
300x / giây!
Đây là một người tiêu dùng ressource lớn! Cũng là một giải pháp tốt sai !!
Sử dụng giấc ngủ dựng sẵn trong perl
Thật không may, nội dung sleep
được giới hạn trong số nguyên. Vì vậy, chúng ta phải sử dụng select
thay thế:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
Theo perl, print while <>
có thể được thay thế bằng công -p
tắc:
perl -pe 'select undef,undef,undef,.00333'
Hãy thử:
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
Giải trình:
300 dòng / giây có nghĩa là 1 dòng bằng 0,0033333333 giây.
print
không có đối số in $_
đó là không gian đầu vào mặc định .
gọi là ... | perl -e
, ... | perl -ne
hoặc ... | perl -pe
, đầu vào tiêu chuẩn sẽ được automaticaly giao cho *STDIN
đó là mô tả tập tin mặc định , vì vậy <>
sẽ làm tương tự như <STDIN>
đó sẽ đọc từ đầu vào tiêu chuẩn cho đến khi $/
( tách hồ sơ đầu vào mà là theo mặc định một newline ) sẽ đạt được. Trong tiếng Anh, theo mặc định <>
sẽ đọc một dòng từ đầu vào tiêu chuẩn và gán nội dung cho $_
biến.
&&
là một và điều kiện, nhưng được sử dụng ở đó như một dấu tách lệnh chuỗi để sau khi (thành công) in một dòng, thực hiện lệnh tiếp theo.
select
là một mẹo của lập trình viên để không sử dụngsleep
. Lệnh này được thiết kế để bẫy các sự kiện trên các mô tả tệp (đầu vào và / hoặc đầu ra, tệp, ổ cắm và / hoặc ổ cắm mạng). Với lệnh này, một chương trình có thể đợi 3 loại sự kiện, nguồn cấp dữ liệu sẵn sàng để đọc , nguồn cấp dữ liệu sẵn sàng để viết và một số sự kiện đã xảy ra trên nguồn cấp dữ liệu . Đối số thứ tư là thời gian chờ tính bằng giây, vì vậy cú pháp là select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
.
Để chính xác hơn, bạn có thể sử dụng Time::Hires
mô-đun perl:
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
Lưu ý: $.
là số dòng đầu vào hiện tại .
Viết tốt hơn là 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 <>
Sử dụng:
catLps.pl [lps] [file] [file]...
Đối số đầu tiên lps
là dòng tùy chọn trên mỗi giây đối số số (mặc định: 300)
Lưu ý: nếu tên tệp chỉ là số, bạn có thể phải chỉ định chúng bằng đường dẫn : ./3
.
Giống như cat
điều này có thể vượt qua các tệp được đưa ra làm đối số và / hoặc đầu vào tiêu chuẩn
Vì vậy, chúng tôi có thể:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Cho vui:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
cat FILENAME | pv -l -L 900 -q
. Giới hạn tính bằng byte trên giây, không phải dòng trên giây, vì vậy tôi đưa ra nhận xét này không phải là câu trả lời.