1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| #! /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()
|
|