我很懶,我可以寫一個腳本來做到這一點,但我甚至懶得去想如何去做。
我常做這樣的事情:
cris$ python runexperiment.py > output.txt
cris$ cat output.txt
有時,當查看實驗的長輸出時,我喜歡讓頁面滾動並觀察連續模式的形成和分散。但對一個包含 100 萬行的檔案使用 cat 可能需要 5 秒鐘才能完成。即使對我來說這也太快了。
有什麼方法可以減慢查看文件的速度,例如“滾動實用程式”?我想要速度快,但不是每秒 200k 行(所有這些可能顯示器都永遠不會註冊)。
就像是
cris$ scroll -lps=300 output.txt
然後坐下來看著每秒 300 行的速度過去將是理想的選擇,我想。
答案1
短和可讀的:
perl -pe "system 'sleep .003'" log.txt
我發布這個解決方案是因為它們很小且可讀,作為評論DM 的回答似乎提倡這種解決方案!
但我討厭這個,因為:對於這次運行,perl 將叉達到/bin/sleep
300x/秒!
這是一個資源消耗大戶!也是一個錯誤好的解決方案!!
使用內建睡懶覺珀爾
不幸的是,內建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>
$/
輸入記錄分隔符預設情況下是新隊)將達到。如果是英文,預設<>
會讀到一來自標準輸入的行並將內容分配給$_
變數。&&
是一個和條件,但在那裡用作鏈結命令分隔符所以在(成功)列印一行後,執行下一個指令。select
是一個程式設計師不使用的技巧sleep
。該命令旨在捕獲事件檔案描述符(輸入和/或輸出、檔案、套接字和/或網路套接字)。透過這個命令,程式可以等待對於 3 種事件,供稿準備閱讀,feed 準備寫入和Feed 上發生了一些事件。第四個參數是以秒為單位的超時,因此語法是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)注意:如果檔案名稱只是數字,您可能必須使用 path: 指定它們
./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))
答案2
只需將 awk 與 sleep 結合使用即可:
awk '{print $0; system("sleep .1");}' log.txt
答案3
您可以使用專門製作的工具,而不是使用解釋器。它可能已安裝在您的發行版上,或者您可以安裝它(apt-get install pv 等..)
若要以每秒 5 行的速度顯示檔案:
cat filename | pv --quiet --line-mode --rate-limit 5
若要以每秒 100 位元組的速度顯示檔案:
cat filename| pv --quiet --rate-limit 100
答案4
Ruby 的sleep
函數支援浮點值,因此這裡有一個基於 @F.Hauri 答案的高效且簡短的解決方案:
ruby -pe 'sleep 0.00333' log.txt
或者
ruby -pe 'sleep (1.0/300)' log.txt