短くて読みやすい:
perl -pe "system 'sleep .003'" log.txt
DMasの答えのコメントがこの種のソリューションを促進しているように見えるので、私はこのソリューションを小さくて読みやすいので投稿します!
しかし、私はこれが嫌いです:この実行のために、perlは300x /秒に分岐し/bin/sleep
ます!
これは大きな資源消費者です!また、間違った良い解決策 !!
Perlで組み込みスリープを使用する
幸いなことに、組み込み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行/秒は、0.0033333333秒で1行を意味します。
print
引数のないprints $_
はデフォルトの入力スペースです。
またはと呼ばれる... | perl -e
、標準入力はデフォルトのファイル記述子である自動入力に割り当てられるため、標準入力から読み取る(デフォルトでは改行である入力レコード区切り文字)に到達するまで同じ処理を行います。英語では、デフォルトで標準入力から1行を読み取り、変数にコンテンツを割り当てます。... | perl -ne
... | perl -pe
*STDIN
<>
<STDIN>
$/
<>
$_
&&
はand条件ですが、そこでチェーンコマンドセパレータとして使用されるため、1行後に(正常に)次のコマンドを実行して印刷します。
select
を使用しないプログラマーのトリックsleep
です。このコマンドは、ファイル記述子(入力および/または出力、ファイル、ソケットおよび/またはネットソケット)のイベントをトラップするように設計されています。このコマンドを使用すると、プログラムは3種類のイベント、フィードの読み取り準備完了、フィードの書き込み準備完了、およびフィードで何らかのイベントが発生するのを待つことができます。4番目の引数は秒単位のタイムアウトなので、構文はです。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
はオプションの1秒あたりの行数の数値引数(デフォルト: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
。制限は1秒あたりの行数ではなく、1秒あたりのバイト数であるため、これを回答ではなくコメントにします。