grep -B and -B flags don’t work when grep is used on the command line with readline support. So I created this little script that does work on the command line. use -h flag to learn. Here’s how I’ve used it:
ls -al | ./printcontext.py -b 1 -a 1 -d test.txt
This finds the test.txt file and prints the 2 files around it.
#!/usr/bin/python # print context when using a python script with readline support (command line piping) # by inderpreetsingh.com import sys, re from optparse import OptionParser def main(): usage = "usage: %prog [options] needle" parser = OptionParser(usage) parser.add_option("-b", "--before", type="int", dest="before", default=0, help='Before context lines (a la grep)') parser.add_option("-a", "--after", type="int", dest="after", default=0, help='After context lines') parser.add_option("-d", "--debug", action="store_true", dest="debug", default=False, help='Debug information.') #Not implemented #parser.add_option("-o", "--output", type="string", dest="output") (options, args) = parser.parse_args() if len(args) != 1: parser.error("Specify what you want to search") needle = args[0] if options.debug: print "\nNeedle: %s\nBefore context lines: %s\nAfter context lines: %s\n" % (needle, options.before, options.after) lines = sys.stdin.readlines() lines = [x.strip() for x in lines] lastline = '' i = 0 for line in lines: if needle in line: # if re.search(needle, line): first = max(0, i - options.before) last = min(len(lines), i + options.after + 1) if options.debug: print "Found '%s' on line %d, printing line %d to %d" % (needle, i, first, last) for println in lines[first:last]: print println print "" lastline = line i += 1 if __name__ == "__main__": main()