#! /usr/bin/env python """Reverse grep. Usage: rgrep [-i] pattern file""" import sysimport reimport 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()
#! /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()