~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Tools/scripts/rgrep.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 as msg:
 
27
        usage("error in regular expression: %s" % str(msg))
 
28
    try:
 
29
        f = open(filename)
 
30
    except IOError as 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()