#!/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;