Kung Fu Kung Fu

Fujian White Crane Kung Fu

Zope Zope

What I have and am doing with Zope

Photos Photos

Photoalbum, both old and new.

Receptsamlingen Receptsamlingen

In Swedish only. About my "Collection of Recipes" website.

Contact me Contact me

My contact details and how to contact me.

  Mobile version of this page Mobile version of this page


 

Grep results expanded

http://www.peterbe.com/plog/grep-results-expanded/Grepexpansion.py

grep, -n, gotoline, expands

23rd of April 2005

I find myself often running a grep command with the -n which means that when it shows the filename it also shows the line number it matched it on. Then what I often do is that I open the found file with my editor and move to that line with the gotoline feature. Here's a cute little bin Python script that expands the result a little bit. Try:

 $ grep -rin 'def set' *      
 frintranet/sequence/tests/testSequence.py:26:    def setUp( self ):
 slimmer/tests/testSlimmer.py:37:    def setUp(self):
 slimmer/tests/testSlimmer.py~:37:    def setUp(self):
 slimmer/tests/testSlimmer.py.bak:42:    def setUp(self):

Now, with Grepexpansion.py as executable (chmod +x Grepexpansion.py) located in the executable PATH:

 $ grep -rin 'def set' * | Grepexpansion.py
 -------------------frintranet/sequence/tests/testSequence.py--------------------
 23 |         Test SortEx .
 24 |     """
 25 | 
 26*|     def setUp( self ):
 27 |         """
 28 |         """
 29 | 
 --------------------------slimmer/tests/testSlimmer.py--------------------------
 34 |    self.time_records = records
 35 | 
 36 |     
 37*|     def setUp(self):
 38 |    self.timed_records=[]
 39 |    
 40 |     def tearDown(self):

You can get more less lines around it with an integer argument like this:

 $ grep -rin 'def set' * | Grepexpansion.py 5

...which will show 5 lines of code on either side.

Putting this together took me about 20 minutes and it's only really tested in my environment. There are of course a zillion things you can do to improve it. Please have a play with it and let me know if you're adding any functionality. Something I'd like to see is colourcoding :)

UPDATE I know that this can be done in grep but I don't know how which means I would have to study the man pages. With pyhton I can just do it and personally I prefer python over bash.


Comment

Alex - 23rd April 2005  [«« Reply to this]
You might be interested in the -A, -B and -C options to grep. These will place matching lines in a specified amount of context.
James Thiele - 23rd April 2005  [«« Reply to this]
% man grep
<snip>
-C [NUM], -NUM, --context[=NUM]
Print NUM lines (default 2) of output context.
<snip>
Martin Blais - 26th April 2005  [«« Reply to this]
hi peterbe
you're reinventing the wheel again.

if you want the editor, you can use grep from within emacs and then next-error / previous-error to automatically open the files and navigate.

an idea: if you're interested in controlling a running instance of emacs from an external program, you can send arbitrary lisp commands using emacsclient thru a socket, say (file-file "filename") (goto-line 67) (recenter). you could even write a GUI program, binding it with emacs in tihs way. if you're interested in fiddling with that, i have some prototype code that demonstrates how to do this.

cheers,
Peter Bengtsson - 26th April 2005   [«« Reply to this]
I *know* that I'm reinventing the wheel; but this time the wheel is more flash. With python *I* get more control plus as a script, it's more reusable than what I could accomplish with bash.

Jed has something called grep_mode which I haven't been using for a long time. And since Jed is my editor of choice, that's where I'll be looking for fancy personal solutions :)
Torsten Will - 27th April 2005  [«« Reply to this]
I would suggest emacs for that purpose. Menu: Tools, Grep. Then, pressing F9 cycles through all matches in your editor. Maybe vi can do it similar...
 
Name:
Email:
hide my email address.

Your email address will be encoded to prevent email-extraction spiders from reading it so you won't get spammed if you decide to show your email address.