Usage
*****
Here is an example shell command that invokes GNU `grep':
grep -i 'hello.*world' menu.h main.c
This lists all lines in the files `menu.h' and `main.c' that contain
the string `hello' followed by the string `world'; this is because `.*'
matches zero or more characters within a line. Note:Regular
Expressions. The `-i' option causes `grep' to ignore case, causing
it to match the line `Hello, world!', which it would not otherwise
match. Note:Invoking, for more details about how to invoke `grep'.
Here are some common questions and answers about `grep' usage.
1. How can I list just the names of matching files?
grep -l 'main' *.c
lists the names of all C files in the current directory whose
contents mention `main'.
2. How do I search directories recursively?
grep -r 'hello' /home/gigi
searches for `hello' in all files under the directory
`/home/gigi'. For more control of which files are searched, use
`find', `grep' and `xargs'. For example, the following command
searches only C files:
find /home/gigi -name '*.c' -print | xargs grep 'hello' /dev/null
3. What if a pattern has a leading `-'?
grep -e '--cut here--' *
searches for all lines matching `--cut here--'. Without `-e',
`grep' would attempt to parse `--cut here--' as a list of options.
4. Suppose I want to search for a whole word, not a part of a word?
grep -w 'hello' *
searches only for instances of `hello' that are entire words; it
does not match `Othello'. For more control, use `\<' and `\>' to
match the start and end of words. For example:
grep 'hello\>' *
searches only for words ending in `hello', so it matches the word
`Othello'.
5. How do I output context around the matching lines?
grep -C 2 'hello' *
prints two lines of context around each matching line.
6. How do I force grep to print the name of the file?
Append `/dev/null':
grep 'eli' /etc/passwd /dev/null
7. Why do people use strange regular expressions on `ps' output?
ps -ef | grep '[c]ron'
If the pattern had been written without the square brackets, it
would have matched not only the `ps' output line for `cron', but
also the `ps' output line for `grep'.
8. Why does `grep' report "Binary file matches"?
If `grep' listed all matching "lines" from a binary file, it would
probably generate output that is not useful, and it might even
muck up your display. So GNU `grep' suppresses output from files
that appear to be binary files. To force GNU `grep' to output
lines even from files that appear to be binary, use the `-a' or
`--binary-files=text' option. To eliminate the "Binary file
matches" messages, use the `-I' or `--binary-files=without-match'
option.
9. Why doesn't `grep -lv' print nonmatching file names?
`grep -lv' lists the names of all files containing one or more
lines that do not match. To list the names of all files that
contain no matching lines, use the `-L' or `--files-without-match'
option.
10. I can do OR with `|', but what about AND?
grep 'paul' /etc/motd | grep 'franc,ois'
finds all lines that contain both `paul' and `franc,ois'.
11. How can I search in both standard input and in files?
Use the special file name `-':
cat /etc/passwd | grep 'alain' - /etc/motd