Search file contents in multiple directories with Recursive grep
Posted by Hodge on May 13, 2008 in Linux, Ubuntu • 1 comment •
There are times – many in fact – when I need to find a file, or multiple files containing a particular string. For example, I’m developing a web application, and need to find out which pages call a particular class method, say, all the files which call the getTopTenCDs() method – I can do this by opening a Terminal, and running grep (Global Regular Expression Print), with a couple of options:
grep -r -n 'getTopTenCDs()' /var/www/cdcollection/*
This will return a list of files, and the lines within those files, and the line numbers containing the string ‘getTopTenCDs()’ in the directory /var/www/cdcollection/. The -n option tells grep to output the line numbers, the -r option tells grep to search recursively through the sub-directories too, and * tells it to look in all files – which can be changed to *.php etc: /var/www/cdcollection/*.php
So, the output would be something along the lines of:
/var/www/cdcollection/viewcd.php:192: $topTen = $cd->getTopTenCDs();
/var/www/cdcollection/sidebar.php:215: $topTen = $cd->getTopTenCDs();
If I just want a list of files without the lines containing the search string, I can use the -l option:
grep -r -l 'getTopTenCDs()' /var/www/cdcollection/*
which would simply return:
/var/www/cdcollection/viewcd.php
/var/www/cdcollection/sidebar.php
As the name implies, grep uses Regular Expressions, and therefore the search string can contain the usual RegEx operatiors: . ? * + {n} etc. RegEx is out of scope for this post I’m affraid – there are dozens of great tutorials available on RegEx, and applying RegEx to grep.
One final point about grep: if the search string begins with a hyphen (minus sign, or whatever you want to call “-”), the search string needs to be preceded with the -e option:
grep -r -e '-starts with a hyphen' /var/www/cdcollection/*
so that grep doesn’t mistake the search pattern for an option! Forget the -e option, and you’ll get:
grep: invalid option -- $
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
Also, remember the ever useful pipe | and output to file > commands. If the list printed by grep is huge, you can simply pipe it to more:
grep -r 'getTopTenCDs()' /var/www/cdcollection/* | more
or, if you want to save it to a file to peruse later:
grep -r 'getTopTenCDs()' /var/www/cdcollection/* > ~/grep_output.txt
Always useful.
Finally, remember to take a look at the grep man page:
man grep
Which contains a world of useful information, including a wealth of options I haven’t covered.
Something not quite right? Inaccuracies or invalid code? Didn’t work for you? Don’t like me using Ss instead of Zs? Add a comment below! All comments are welcome. Except spam, because spam is a bit crap.
|
|
Lof of 25 DELL CORE 2 DUO LAPTOP XP COMPUTER NOTEBOOK 1 $6,974.97 |
|
|
LOT OF 20 DELL INSPIRON LAPTOP NOTEBOOK COMPUTER $5,918.00 |
|
|
Lot 6 New HP G60 15.6 Laptop Notebook Win 7 HDMI Webcam $3,149.95 |
|
|
Lof of 10 DELL CORE 2 DUO LAPTOP XP COMPUTER NOTEBOOK 1 $2,819.97 |
|
|
NEW HP ENVY 17 Laptop Core i7 EXTREME i7-920XM Notebook $2,699.00 |
Related posts:
Related posts brought to you by Yet Another Related Posts Plugin.






[...] Search file contents in multiple directories with Recursive grep | 64 Bit Jungle (tags: linux howto grep recursive pattern hacks commandline cli) [...]