ref: 0e6e44b06400e320145eb5115edce054cfd26d1f
dir: /sys/src/cmd/python/Tools/scripts/rgrep.py/
#! /usr/bin/env python """Reverse grep. Usage: rgrep [-i] pattern file """ import sys import re import getopt def main(): bufsize = 64*1024 reflags = 0 opts, args = getopt.getopt(sys.argv[1:], "i") for o, a in opts: if o == '-i': reflags = reflags | re.IGNORECASE if len(args) < 2: usage("not enough arguments") if len(args) > 2: usage("exactly one file argument required") pattern, filename = args try: prog = re.compile(pattern, reflags) except re.error, msg: usage("error in regular expression: %s" % str(msg)) try: f = open(filename) except IOError, msg: usage("can't open %s: %s" % (repr(filename), str(msg)), 1) f.seek(0, 2) pos = f.tell() leftover = None while pos > 0: size = min(pos, bufsize) pos = pos - size f.seek(pos) buffer = f.read(size) lines = buffer.split("\n") del buffer if leftover is None: if not lines[-1]: del lines[-1] else: lines[-1] = lines[-1] + leftover if pos > 0: leftover = lines[0] del lines[0] else: leftover = None lines.reverse() for line in lines: if prog.search(line): print line def usage(msg, code=2): sys.stdout = sys.stderr print msg print __doc__ sys.exit(code) if __name__ == '__main__': main()