Cat-Datei zum Terminal mit einer bestimmten Geschwindigkeit von Zeilen pro Sekunde

Cat-Datei zum Terminal mit einer bestimmten Geschwindigkeit von Zeilen pro Sekunde

Ich bin faul und könnte ein Skript dafür schreiben, aber ich bin sogar zu faul, mir zu überlegen, wie das geht.

Ich mache oft Dinge wie:

cris$ python runexperiment.py > output.txt
cris$ cat output.txt

Manchmal lasse ich die Seite einfach scrollen, wenn ich mir die lange Ausgabe eines Experiments ansehe, und beobachte, wie sich die Muster bilden und wieder auflösen. Aber wenn ich cat auf eine Datei mit 1 Million Zeilen anwende, dauert es vielleicht 5 Sekunden. Das ist sogar für mich zu schnell.

Gibt es eine Möglichkeit, die Anzeigegeschwindigkeit der Datei zu verlangsamen, etwa mit einem „Scroll-Dienstprogramm“? Ich möchte schnell, aber nicht 200.000 Zeilen pro Sekunde (die das Display vermutlich sowieso nie registrieren würde).

Etwas wie

cris$ scroll -lps=300 output.txt

Und dann zurückzulehnen und zuzusehen, wie 300 Zeilen pro Sekunde vorbeiziehen, stelle ich mir das Ideal vor.

Antwort1

Kurz undlesbar:

perl -pe "system 'sleep .003'" log.txt

Ich poste diese Lösungen, weil sie klein und lesbar sind, als Kommentare vonAntwort von DMasscheinen diese Art von Lösung zu fördern!

Aber ich hasse das, weil: Für diesen Lauf wird PerlGabelbis /bin/sleep300x/Sekunde!

Das ist ein großer Ressourcenverbraucher! Auch ein falschergute Lösungen!!

Verwenden voneingebautausschlafen

Leider sleepist Builtin auf Ganzzahlen beschränkt. Daher müssen wir selectstattdessen Folgendes verwenden:

perl -e 'print && select undef,undef,undef,.00333 while <>;'

Unter Perl print while <>könnte es durch den Schalter ersetzt werden -p:

perl -pe 'select undef,undef,undef,.00333'

Lass es uns versuchen:

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

Erläuterung:

  • 300 Zeilen/Sek. bedeutet 1 Zeile mal 0,0033333333 Sekunden.

  • printohne Argument druckt, $_was istStandardeingabebereich.

  • genannt als ... | perl -e, ... | perl -neoder ... | perl -pe, Standardeingabe würde automatisch zugewiesen werden, *STDINwas istStandarddateideskriptor, <>würde also dasselbe bewirken wie „ <STDIN>which liest von der Standardeingabe, bis $/(Eingabedatensatz-TrennzeichenDas ist standardmäßig einNeue Zeile) erreicht. Auf Englisch <>lautet es standardmäßigeinsZeile von der Standardeingabe und weisen Sie den Inhalt der $_Variablen zu.

  • &&ist einUndZustand, sondern wird dort alsKettenbefehlstrennzeichenFühren Sie also nach dem (erfolgreichen) Drucken einer Zeile den nächsten Befehl aus.

  • selectist einProgrammiertrick, den man nicht verwenden solltesleepDieser Befehl dient zum Abfangen von Ereignissen aufDateideskriptoren(Ein- und/oder Ausgänge, Dateien, Sockets und/oder Net-Sockets). Mit diesem Befehl könnte ein ProgrammWartenfür 3 Arten von Veranstaltungen,Feed zum Lesen bereit,Feed bereit zum SchreibenUndirgendein Ereignis ist im Feed passiert. Das vierte Argument ist ein Timeout in Sekunden, die Syntax ist also select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>.

Für mehr Präzision können Sie Time::Hiresdas Perl-Modul verwenden:

perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'

Hinweis: $.istaktuelle Eingabezeilennummer.

Besser geschrieben alscat >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 <>

Verwendung:

catLps.pl [lps] [file] [file]...

Erstes Argumentlpsist ein optionales numerisches Argument für Zeilen pro Sekunde (Standard: 300)

Hinweis: Wenn der Dateiname nur aus Zahlen besteht, müssen Sie ihn möglicherweise mit „Pfad:“ angeben ./3.

So catkönnten als Argument angegebene Dateien übergeben werden und/oderStandardeingabe

Wir könnten also:

TIMEFORMAT='%R' 
time seq 1 100 | ./catLps.pl 100 >/dev/null 
1.040

time seq 1 10000 | ./catLps.pl 10000 >/dev/null  
1.042

Zum Spass:

export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))

Antwort2

verwenden Sie einfach awk mit sleep:

awk '{print $0; system("sleep .1");}' log.txt

Antwort3

Anstatt einen Interpreter zu verwenden, können Sie ein speziell dafür erstelltes Tool verwenden. Es ist wahrscheinlich auf Ihrer Distribution installiert oder Sie können es installieren (apt-get install pv usw.).

So zeigen Sie die Datei mit 5 Zeilen pro Sekunde an:

cat filename | pv --quiet --line-mode --rate-limit 5

So zeigen Sie die Datei mit 100 Bytes pro Sekunde an:

cat filename| pv --quiet  --rate-limit 100

Antwort4

Die Funktion von Ruby sleepunterstützt Gleitkommawerte, hier also eine effiziente und kurze Lösung basierend auf der Antwort von @F.Hauri:

ruby -pe 'sleep 0.00333' log.txt

oder

ruby -pe 'sleep (1.0/300)' log.txt

verwandte Informationen