You need to find a phrase in over 200 files worth of code. Manual searching is not a feasible option. If you are like me you know about grep, but it has always made you nervous. It is so powerful reading the man page was like a tech manual for an engine. Fortunately, getting the benefits of grep with little pain is easy, once you finally figure it out.
Over the last few months I have had to use grep more and more, and I would say I use the same type of search 80% of the time. It gets me what I need quickly and efficiently without much fuss.
What is Grep
The best full explanation comes from the grep man page.
Grep searches the named input FILEs (or standard input if no files are named, or the file name – is given) for lines containing a match to the given pattern. By default, grep prints the matching lines.
My explanation is it finds stuff in files and shows you where it is. It is amazingly useful because of the speed, and by showing the line it found it on along with the file name so you can more easily compare if that is what you need over just a file name.
Grep is very powerful, but I get by with 3 variations day to day for most of my needs. First lets look at how to structure your grep
grep <options> <search-term> <location>
This is important to remember as it can be frustrating when you forget and nothing works.
- options – these are the different flags that can help you get more robust or targeted results back.
- search-term – this takes any pattern/regular expression to match against all the files you are searching
- location – this is where you put a directory or leave blank to search stdout/stdin
Grep with Other Commands
If you don’t put in a location it searches stdout/stdin. That is useful if you pipe (|) a bunch of data to grep for searching it. A mundane example is
ls -lha | grep buddy
This does a normal ls -lha and passes the result to grep. From there it only returns lines that have the word “buddy” in them.
To show the regular expression usage you can do:
ls -lha | grep ^d
This returns only results where the line starts with d. In the case of ls it means only directories are returned.
Where you will probably spend most of your time is searching for text inside of files. Mostly you will need to know the file and line number of where the word you are looking for is located.
grep -rn hello .
This searches for hello in every file in the current directory and subdirectory. It then shows you the line in the file and the file number it is on. The options are fairly easy to remember as well:
- r – recursively search files
- n – display line numbers
Sometimes you get too many results or you get results in the folders you don’t want to search in. One of the projects I work on at work has a .svn folder that needs to stay. So I usually have to not include the directory. Fortunately it is easy.
grep -rn --exclude-dir=.svn hello .
Above is about all you need to know to get started using grep. It is an awesome tool with a lot more features cane you can do some crazy cool searches. It also actually helps you find elusive pieces of code.