Archivo Cat al terminal a una velocidad particular de líneas por segundo.

Archivo Cat al terminal a una velocidad particular de líneas por segundo.

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

¡Este es un gran consumidor de recursos! también un malbuenas soluciones!!

Usandoincorporadodormir

Desafortunadamente, la función incorporada sleepse limita a números enteros. Entonces tenemos que usar selecten su lugar:

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

En Perl, print while <>podría sustituirse por el -pmodificador:

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.

  • printsin argumento imprime $_cuál esespacio de entrada predeterminado.

  • llamada como ... | perl -e, ... | perl -neo ... | perl -pe, la entrada estándar se asignará automáticamente a *STDINcuá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.

  • selectes 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 es select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>.

Para mayor precisión, puede utilizar Time::Hiresel 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 argumentolpses 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 catse 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 sleepadmite 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

información relacionada