home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / pythonwin / python.exe / RGREP.PY < prev    next >
Encoding:
Python Source  |  2002-09-11  |  1.5 KB  |  65 lines

  1. #! /usr/bin/env python
  2.  
  3. """Reverse grep.
  4.  
  5. Usage: rgrep [-i] pattern file
  6. """
  7.  
  8. import sys
  9. import re
  10. import getopt
  11.  
  12. def main():
  13.     bufsize = 64*1024
  14.     reflags = 0
  15.     opts, args = getopt.getopt(sys.argv[1:], "i")
  16.     for o, a in opts:
  17.         if o == '-i':
  18.             reflags = reflags | re.IGNORECASE
  19.     if len(args) < 2:
  20.         usage("not enough arguments")
  21.     if len(args) > 2:
  22.         usage("exactly one file argument required")
  23.     pattern, filename = args
  24.     try:
  25.         prog = re.compile(pattern, reflags)
  26.     except re.error, msg:
  27.         usage("error in regular expression: %s" % str(msg))
  28.     try:
  29.         f = open(filename)
  30.     except IOError, msg:
  31.         usage("can't open %s: %s" % (repr(filename), str(msg)), 1)
  32.     f.seek(0, 2)
  33.     pos = f.tell()
  34.     leftover = None
  35.     while pos > 0:
  36.         size = min(pos, bufsize)
  37.         pos = pos - size
  38.         f.seek(pos)
  39.         buffer = f.read(size)
  40.         lines = buffer.split("\n")
  41.         del buffer
  42.         if leftover is None:
  43.             if not lines[-1]:
  44.                 del lines[-1]
  45.         else:
  46.             lines[-1] = lines[-1] + leftover
  47.         if pos > 0:
  48.             leftover = lines[0]
  49.             del lines[0]
  50.         else:
  51.             leftover = None
  52.         lines.reverse()
  53.         for line in lines:
  54.             if prog.search(line):
  55.                 print line
  56.  
  57. def usage(msg, code=2):
  58.     sys.stdout = sys.stderr
  59.     print msg
  60.     print __doc__
  61.     sys.exit(code)
  62.  
  63. if __name__ == '__main__':
  64.     main()
  65.