2.4 grep Programs

grep searches the named input files for lines containing a match to the given patterns. By default, grep prints the matching lines. A file named - stands for standard input. If no input is specified, grep searches the working directory . if given a command-line option specifying recursion; otherwise, grep searches standard input. There are four major variants of grep, controlled by the following options.


Interpret patterns as basic regular expressions (BREs). This is the default.


Interpret patterns as extended regular expressions (EREs). (-E is specified by POSIX.)


Interpret patterns as fixed strings, not regular expressions. (-F is specified by POSIX.)


Interpret patterns as Perl-compatible regular expressions (PCREs). PCRE support is here to stay, but consider this option experimental when combined with the -z (--null-data) option, and note that ‘grep -P’ may warn of unimplemented features. See Other Options.

For documentation, refer to https://www.pcre.org/, with these caveats:

  • \d’ matches only the ten ASCII digits (and ‘\D’ matches the complement), regardless of locale. Use ‘\p{Nd}’ to also match non-ASCII digits. (The behavior of ‘\d’ and ‘\D’ is unspecified after in-regexp directives like ‘(?aD)’.)
  • Although PCRE tracks the syntax and semantics of Perl’s regular expressions, the match is not always exact. For example, Perl evolves and a Perl installation may predate or postdate the PCRE2 installation on the same host, or their Unicode versions may differ, or Perl and PCRE2 may disagree about an obscure construct.
  • By default, grep applies each regexp to a line at a time, so the ‘(?s)’ directive (making ‘.’ match line breaks) is generally ineffective. However, with -z (--null-data) it can work:
    $ printf 'a\nb\n' |grep -zP '(?s)a.b'

    But beware: with the -z (--null-data) and a file containing no NUL byte, grep must read the entire file into memory before processing any of it. Thus, it will exhaust memory and fail for some large files.