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/sleep
300x/Sekunde!
Das ist ein großer Ressourcenverbraucher! Auch ein falschergute Lösungen!!
Verwenden voneingebautausschlafenperl
Leider sleep
ist Builtin auf Ganzzahlen beschränkt. Daher müssen wir select
stattdessen 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.
print
ohne Argument druckt,$_
was istStandardeingabebereich.genannt als
... | perl -e
,... | perl -ne
oder... | perl -pe
, Standardeingabe würde automatisch zugewiesen werden,*STDIN
was 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.select
ist einProgrammiertrick, den man nicht verwenden solltesleep
Dieser 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 alsoselect <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::Hires
das 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 Argument
lps
ist 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
cat
kö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 sleep
unterstü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