How to print last <n> pages of a file?

Larry Wall lwall at jpl-devvax.jpl.nasa.gov
Sat May 4 04:32:51 AEST 1991


In article <1991May3.002457.18028 at elroy.jpl.nasa.gov> pjs at euclid.jpl.nasa.gov writes:
: In article <1991May2.182639.21845 at iwarp.intel.com>, merlyn at iwarp.intel.com (Randal L. Schwartz) writes:
: > In article <1991May2.162355.779 at elroy.jpl.nasa.gov>, pjs at euclid (Peter Scott) writes:
: > | How can I print the last <n> pages of a text file?  Said file has form
: > | feeds at random places, so "tail -132 file | lpr" won't work.  Now, I tried
: > | "pr file | tail -132" but that includes the 5-line headers and footers
: > | that I don't want and don't get with "lpr file".  So I tried 
: > | "pr -t file | tail -132" but the -t option turns off page filling so the
: > | form feeds aren't expanded :-(.
: > | 
: > | Any suggestions?  SunOS 4.1 over here.
: > 
: > A quick Perl solution:
: > 
: > ################################################## snip
: > #!/usr/bin/perl
: > 
: > $tail = shift || 1;
: > 	## first arg is number of pages to tail (default is 1)
: > 	## rest of args are processed like "cat"
: > 
: > $/ = "\f"; # input separator set to form-feed
: > while (<>) {
: > 	push(@q,$_);
: > 	shift(@q) while @q > $tail; # keep only $tail pages in queue
: > }
: > print @q;
: > exit 0;
: > ################################################## snip
: 
: Hmm, nice, but tell me, does it work when a page *doesn't* have a form
: feed to separate it?  I.e., there's more than 66 lines between FF's?

OK, change that to:

#!/usr/bin/perl

$tail = shift || 1;

$/ = "\f"; # input separator set to form-feed
while (<>) {
    push(@q, $1) while s/^((.*\n){66})//;
    push(@q, $_) if length;
    shift(@q) while @q > $tail;
}
print @q;

Larry Wall
lwall at netlabs.com



More information about the Comp.unix.questions mailing list