| 
									
										
										
										
											1998-08-12 17:47:52 +00:00
										 |  |  | #! /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) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except re.error as msg: | 
					
						
							| 
									
										
										
										
											1998-08-12 17:47:52 +00:00
										 |  |  |         usage("error in regular expression: %s" % str(msg)) | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         f = open(filename) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except IOError as msg: | 
					
						
							| 
									
										
										
										
											1998-08-12 17:47:52 +00:00
										 |  |  |         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) | 
					
						
							| 
									
										
										
										
											2002-09-11 20:36:02 +00:00
										 |  |  |         lines = buffer.split("\n") | 
					
						
							| 
									
										
										
										
											1998-08-12 17:47:52 +00:00
										 |  |  |         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): | 
					
						
							| 
									
										
										
										
											2007-08-03 17:06:41 +00:00
										 |  |  |                 print(line) | 
					
						
							| 
									
										
										
										
											1998-08-12 17:47:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def usage(msg, code=2): | 
					
						
							|  |  |  |     sys.stdout = sys.stderr | 
					
						
							| 
									
										
										
										
											2007-08-03 17:06:41 +00:00
										 |  |  |     print(msg) | 
					
						
							|  |  |  |     print(__doc__) | 
					
						
							| 
									
										
										
										
											1998-08-12 17:47:52 +00:00
										 |  |  |     sys.exit(code) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     main() |