Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I'm lazy and I could write a script to do this, but I'm even too lazy to think of how to do it.

I often do things like :

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

Sometimes when looking at the long output of an experiment I like to let the page just scroll and watch the successive patterns form and disperse. But using cat on a file with 1 million lines finishes in maybe 5 seconds. This is too quick even for me.

Is there any way that I can slow down the speed of viewing the file, something like a 'scroll utility'? I want fast, but not 200k lines a second (all of which presumably the display would never even register anyway).

Something like

cris$ scroll -lps=300 output.txt

And then sitting back and watching 300 lines per second roll past would be ideal, I imagine.

share|improve this question
2  
Try something like cat FILENAME | pv -l -L 900 -q. The limit is in bytes per second, not lines per second, so I'm making this a comment not an answer. –  David Schwartz Dec 31 '12 at 7:54
    
Ok well that is a cool utility, and that works in part. But yes, it is a little choppy since it goes after bps not lps. –  Cris Stringfellow Dec 31 '12 at 8:03
add comment

1 Answer

up vote 2 down vote accepted

There are several utities that let you specify a rate, like pv. But rate in bytes per seconds, not lines per seconds.

But if you really wanna lps, you could:

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

Let try:

time /bin/ls -l /usr/bin | perl -e 'print && select undef,undef,undef,.00333 while <>;' | wc
   2667   24902  171131

real    0m9.173s
user    0m0.056s
sys     0m0.048s

bc -l < <(echo 2667/9.173)
290.74457647443584432573

Explanation:

  • 300 lines / sec mean 1 line by 0.0033333333 secs.

  • print without argument print $_ wich is default input space.

  • called as ... | perl -e, ... | perl -ne or ... | perl -pe, standard input would be automaticaly assigned to *STDIN which is default file descriptor. so <> would do same as <STDIN> which will read from standard input until $/ (input record separator which is by default a newline) will be reached. In english, by default <> will read one line from standard input and assign content to $_ variable.

  • && is a and condition, but is used there as a chain command separator so after (successfully) print one line, doing next command.

  • select is a programmer's trick to not use sleep. This command is designed to trap events on file descriptors (inputs and/or outputs, files, socket and/or net sockets). With this command, a program could wait for 3 kind of events feed ready to read, feed ready to write and some event happened on feed. The fourth argument is a timeout in seconds. so syntax is select <feeds where wait for input>, <feeds where having to write>, <feed where something could happen>, <timeout>.

For more precision, you could use Time::Hires perl module:

perl -MTime::HiRes -e 'BEGIN{$start=Time::HiRes::time;$sleepPerLine=1/300};print && select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time) while <>

Nota: $. is current input line number.

Better written as 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;
my $sleepPerLine=1/$lps;

print &&
    select undef,undef,undef,($start + $sleepPerLine*$. - Time::HiRes::time)
    while <>

So we could:

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

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

For fun:

export TIMEFORMAT='%R' ;clear ;time seq 1 $((LINES-2)) | ./catLps.pl $((LINES-2))
share|improve this answer
1  
that looks like some serious voodoo you are doing there. that is so cool, i tried it and it works. i have no idea how you did that though. what the hell is perl select ? undef? i can look it up. amazing. –  Cris Stringfellow Dec 31 '12 at 8:18
1  
@CrisStringfellow Ok, I've added some explanation and a full script using Time::HiRes perl module for more accuracy –  F. Hauri Dec 31 '12 at 9:29
    
my god. That is an awesome answer. Thank you. I tried to upvote it a second time. I am learning something by reading your wonderful explanation. –  Cris Stringfellow Dec 31 '12 at 9:42
1  
You could upvote my comments too ;-) –  F. Hauri Dec 31 '12 at 9:46
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.