Soy vago y podría escribir un guión para hacer esto, pero soy incluso demasiado vago para pensar en cómo hacerlo.
A menudo hago cosas como:
cris$ python runexperiment.py > output.txt
cris$ cat output.txt
A veces, cuando observo el resultado extenso de un experimento, me gusta dejar que la página se desplace y observe cómo se forman y dispersan los patrones sucesivos. Pero usar cat en un archivo con 1 millón de líneas finaliza en quizás 5 segundos. Esto es demasiado rápido incluso para mí.
¿Hay alguna forma de reducir la velocidad de visualización del archivo, algo así como una "utilidad de desplazamiento"? Quiero líneas rápidas, pero no 200.000 por segundo (todo lo cual presumiblemente la pantalla ni siquiera se registraría de todos modos).
Algo como
cris$ scroll -lps=300 output.txt
Y luego sentarse y ver pasar 300 líneas por segundo sería ideal, me imagino.
Respuesta1
Corto ylegible:
perl -pe "system 'sleep .003'" log.txt
Publico estas soluciones porque son pequeñas y legibles, como comentarios deLa respuesta de DMas¡Parece promover este tipo de solución!
Pero odio esto porque: Para esta ejecución, Perltenedor¡a /bin/sleep
300x/segundos!
¡Este es un gran consumidor de recursos! también un malbuenas soluciones!!
Usandoincorporadodormirperla
Desafortunadamente, la función incorporada sleep
se limita a números enteros. Entonces tenemos que usar select
en su lugar:
perl -e 'print && select undef,undef,undef,.00333 while <>;'
En Perl, print while <>
podría sustituirse por el -p
modificador:
perl -pe 'select undef,undef,undef,.00333'
Intentemos:
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
Explicación:
300 líneas/seg significa 1 línea por 0,0033333333 segundos.
print
sin argumento imprime$_
cuál esespacio de entrada predeterminado.llamada como
... | perl -e
,... | perl -ne
o... | perl -pe
, la entrada estándar se asignará automáticamente a*STDIN
cuál esdescriptor de archivo predeterminado, entonces<>
haría lo mismo<STDIN>
que leerá desde la entrada estándar hasta$/
(separador de registros de entradaque es por defecto unnueva línea) será alcanzado. En inglés, por defecto<>
se leeráunolínea desde la entrada estándar y asignar contenido a$_
la variable.&&
es unycondición, pero se utiliza allí comoseparador de comando en cadenaentonces, después de imprimir (con éxito) una línea, ejecute el siguiente comando.select
es untruco del programador para no usarsleep
. Este comando está diseñado para atrapar eventos endescriptores de archivos(entradas y/o salidas, archivos, socket y/o sockets de red). Con este comando, un programa podríaesperarpara 3 tipos de eventos,feed listo para leer,feed listo para escribiryalgún evento ocurrió en el feed. El cuarto argumento es un tiempo de espera en segundos, por lo que la sintaxis esselect <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>
.
Para mayor precisión, puede utilizar Time::Hires
el módulo Perl:
perl -MTime::HiRes -pe 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)'
Nota: $.
esnúmero de línea de entrada actual.
Mejor escrito comocat >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 <>
Uso:
catLps.pl [lps] [file] [file]...
Primer argumento
lps
es un argumento numérico opcional de línea por segundo (predeterminado: 300)Nota: si el nombre del archivo es solo numérico, es posible que deba especificarlo con la ruta:
./3
.De esta manera
cat
se podrían pasar archivos dados como argumento y/oentrada estándar
Entonces podríamos:
TIMEFORMAT='%R'
time seq 1 100 | ./catLps.pl 100 >/dev/null
1.040
time seq 1 10000 | ./catLps.pl 10000 >/dev/null
1.042
Por diversión:
export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
Respuesta2
solo usa awk con dormir:
awk '{print $0; system("sleep .1");}' log.txt
Respuesta3
En lugar de utilizar un intérprete, puede utilizar una herramienta diseñada específicamente. Probablemente esté instalado en tu distribución o puedes instalarlo (apt-get install pv, etc.)
Para mostrar el archivo a 5 líneas por segundo:
cat filename | pv --quiet --line-mode --rate-limit 5
Para mostrar el archivo a 100 bytes por segundo:
cat filename| pv --quiet --rate-limit 100
Respuesta4
La función de Ruby sleep
admite valores de punto flotante, por lo que aquí hay una solución breve y eficiente basada en la respuesta de @F.Hauri:
ruby -pe 'sleep 0.00333' log.txt
o
ruby -pe 'sleep (1.0/300)' log.txt