Cat 檔案以特定的每秒行數速度傳輸到終端

Cat 檔案以特定的每秒行數速度傳輸到終端

我很懶,我可以寫一個腳本來做到這一點,但我甚至懶得去想如何去做。

我常做這樣的事情:

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/sleep300x/秒!

這是一個資源消耗大戶!也是一個錯誤好的解決方案!!

使用內建睡懶覺

不幸的是,內建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::Hiresperl 模組:

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

相關內容