Knowledge

How to search file contents with grep

#CommandLine

Search inside files with grep — recursive search, case-insensitive matching, line numbers, context, regex and piping output from other commands into grep.

Published by Mark van Eijk on June 23, 2026 · 1 minute read

  1. Searching inside files with grep
  2. Search recursively
  3. Case-insensitive matching
  4. Show line numbers
  5. Match whole words and invert
  6. Count matches
  7. Show surrounding context
  8. Using regular expressions
  9. Piping into grep

Searching inside files with grep

While find locates files by their name or metadata, grep searches what's inside them. It scans for lines matching a pattern and prints them. The basic form is grep 'pattern' file:

grep 'database' config/app.php

Search recursively

To search every file under a directory, add -r (recursive). This is the one I use most:

grep -r 'API_KEY' .

Case-insensitive matching

By default grep is case-sensitive. Add -i to ignore case, so Error, error and ERROR all match:

grep -ri 'todo' src/

Show line numbers

Add -n to prefix each match with its line number, which makes jumping to it in an editor much faster:

grep -n 'function' app.js

Match whole words and invert

Use -w to match a whole word only, so searching log won't also match login or catalog:

grep -w 'log' app.php

Flip the logic with -v to print lines that don't match — useful for filtering noise out of a file:

grep -v '^#' config.ini

That example drops every commented line (those starting with #).

Count matches

When you only care how many times something appears, -c prints the count of matching lines instead of the lines themselves:

grep -c 'POST' access.log

Show surrounding context

Sometimes the matching line alone isn't enough. Use -A for lines after, -B for before, and -C for both:

grep -C 3 'Exception' storage/logs/laravel.log

This prints each match with 3 lines on either side.

Using regular expressions

The pattern is a regular expression, so you can match more than literal text. Add -E for extended regex syntax like alternation and +:

grep -E 'warning|error|critical' app.log

This finds any line containing one of those three words.

Piping into grep

grep really shines at the end of a pipe, filtering the output of another command. This is everyday glue on the command line:

ps aux | grep nginx
git log --oneline | grep 'fix'

Combine these flags freely — for example grep -rin 'token' . gives you a recursive, case-insensitive search with line numbers — and grep becomes one of the most useful tools in your kit.

Subscribe to our newsletter

Do you want to receive regular updates with fresh and exclusive content to learn more about web development, hosting, security and performance? Subscribe now!

Related articles

Argument list too long (Bash: /bin/rm)

Search inside files with grep — recursive search, case-insensitive matching, line numbers, context, regex and piping output from other commands into grep.

Read more →

How to install Composer packages locally

Search inside files with grep — recursive search, case-insensitive matching, line numbers, context, regex and piping output from other commands into grep.

Read more →