grep - macOS


Overview

grep (global regular expression print) is a powerful command-line utility in macOS used for searching plain-text data sets for lines that match a regular expression. Its primary function is to filter and display lines in files or streams that match specific patterns. It is highly useful in text processing for tasks such as log analysis, searching codebases, and automating tasks across several files.

Syntax

The basic syntax of grep is as follows:

grep [options] pattern [files]
  • pattern refers to the regular expression that grep uses for matching.
  • [files] indicates the files to search (optional if input is piped from another command).

Options/Flags

Here are some commonly used options in grep:

  • -i — Ignores case distinctions in both the pattern and the input files.
  • -v — Inverts the match, i.e., selects non-matching lines.
  • -c — Counts the number of lines that match the pattern.
  • -l — Lists the filename of each file with matching content.
  • -n — Prefixes each line of output with the line number within its input file.
  • -E — Interprets pattern as an extended regular expression (ERE).
  • -F — Interprets pattern as a list of fixed strings (faster than regular expressions).
  • -r or -R — Recursively search subdirectories listed.
  • -x — Select only those matches that exactly match the whole line.
  • -o — Shows only the part of a line matching the pattern.

Examples

  1. Simple Search: Search for the word “error” in a file named logfile.txt.

    grep "error" logfile.txt
    
  2. Case Insensitive Search: Search for “error”, ignoring case, in multiple files.

    grep -i "error" logfile1.txt logfile2.txt
    
  3. Recursive Search: Search for “error” in all files under the current directory and subdirectories.

    grep -r "error" .
    
  4. Count Matches: Count the number of lines that contain the word “error”.

    grep -c "error" logfile.txt
    
  5. Line Numbers: Display line numbers that contain the word “error”.

    grep -n "error" logfile.txt
    
  6. Invert Match: Display lines that do not contain the word “error”.

    grep -v "error" logfile.txt
    

Common Issues

  • Pattern not found: If no lines match, grep won’t output anything.
  • Binary files matched: Use --binary-files=text to treat binary files as text.
  • Escaping special characters: Special characters must be escaped with a backslash \.

Integration

grep can be combined effectively with other commands like sort, awk, sed:

  • Combine with sort:

    grep "error" logfile.txt | sort | uniq -c
    

    This chain searches for “error”, sorts the results, and counts unique lines.

  • Extensive log parsing:

    cat logfile.txt | grep "ERROR" -A 3 -B 2 | grep "timeout"
    

    Search for “ERROR”, including 2 lines before and 3 after each match, then filter those blocks for “timeout”.

  • egrep: An alias to grep -E, handles extended regular expressions.
  • fgrep: An alias to grep -F, treats pattern as fixed strings.
  • awk and sed: Other text manipulation tools that can be used with or replace grep in complex scenarios.

For more detailed information, visit the official grep documentation.