Go to the first, previous, next, last section, table of contents.


Here is an example shell command that invokes GNU @command{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. See section Regular Expressions. The `-i' option causes @command{grep} to ignore case, causing it to match the line `Hello, world!', which it would not otherwise match. See section Invoking @command{grep}, for more details about how to invoke @command{grep}.

Here are some common questions and answers about @command{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 @command{find}, @command{grep} and @command{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', @command{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 @command{ps} output?
    ps -ef | grep '[c]ron'
    If the pattern had been written without the square brackets, it would have matched not only the @command{ps} output line for @command{cron}, but also the @command{ps} output line for @command{grep}.
  8. Why does @command{grep} report "Binary file matches"? If @command{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 @command{grep} suppresses output from files that appear to be binary files. To force GNU @command{grep} to output lines even from files that appear to be binary, use the `-a' or `--text' 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

Go to the first, previous, next, last section, table of contents.