#!/usr/local/bin/perl

# grev - grep reverse © 1995 Roman Czyborra@cs.tu-berlin.de

($pattern, $file) = @ARGV;
die "Usage: grev pattern file\n" unless $file;
open (LOG, $file) || die "Can't open $file: $!\n";

# Um Fragestellungen der Art »Wann wurde diese Seite das letzte Mal
# zugegriffen?« zu beantworten, will ich nicht das ganze zig Megabyte
# große /home/www/log/access_log von vorne nach hinten durchgreppen,
# sondern von hinten nach vorne suchen und die Suche abbrechen, sobald
# ich genug gefunden habe.

seek (LOG, 0, 2) || die "Can't seek to end of $file: $!\n";
$pos = tell LOG; $pos = $pos - $pos % ($block = 8192);

# Dieses Programm durchsucht nur Files mit Textzeilen

$\="\n";

# Gehe blockweise von hinten nach vorne.  Der Anfang des Blockes ist
# dabei höchstwahrscheinlich das Ende der letzten Zeile aus dem
# vorherigen Block.

while ($pos >= 0)
{
	seek (LOG, $pos, 0) || die "seek $pos failed: $!\n";
	read (LOG, $_, $block); $_.= $leftover;
	($leftover, @lines) = split ("\n");
	for (reverse grep (/$pattern/o, @lines)) { print; }
	$pos -= $block;
}

$_= $leftover; print if /$pattern/o;
