Search code examples
regexgrep

How to find patterns across multiple lines using grep?


I want to find files that have "abc" AND "efg" in that order, and those two strings are on different lines in that file. Eg: a file with content:

blah blah..
blah blah..
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah blah..
blah blah..

Should be matched.


Solution

  • Grep is an awkward tool for this operation.

    pcregrep which is found in most of the modern Linux systems can be used as

    pcregrep -M 'abc.*(\n|.)*efg' test.txt
    

    where -M, --multiline allow patterns to match more than one line

    There is a newer pcre2grep also. Both are provided by the PCRE project.

    pcre2grep is available for Mac OS X via Mac Ports as part of port pcre2:

    % sudo port install pcre2 
    

    and via Homebrew as:

    % brew install pcre
    

    or for pcre2

    % brew install pcre2
    

    pcre2grep is also available on Linux (Ubuntu 18.04+)

    $ sudo apt install pcre2-utils # PCRE2
    $ sudo apt install pcregrep    # Older PCRE