[Solved-6 Solutions] How to find patterns across multiple lines using grep - Linux Tutorial
Problem :
How to find patterns across multiple lines using grep ?
Solution 1:
You can use grep. incase you are not keen in the sequence of the pattern.
grep -l "pattern1" filepattern*.* | xargs grep "pattern2"
Example:
grep -l "vector" *.cpp | xargs grep "map"
grep -l will find all the files which matches the first pattern, and xargs will grep for the second pattern.
Solution 2:
In the modern Linux systems using as
pcregrep -M 'abc.*(\n|.)*efg' test.txt
pcre2grep is available for Mac OS X
% sudo port install pcre2
and via Homebrew as:
% brew install pcre
Solution 3:
It is simple to make:
sed -e '/abc/,/efg/!d' [file-with-content]
Solution 4:
At the same line to display as 'abc' and 'efg' can be :
grep -zl 'abc.*efg' <your list of files>
At different lines to display as 'abc' and 'efg' must be:
grep -Pzl '(?s)abc.*\n.*efg' <list of files>
-z
Set of lines to terminated as zero
-l
print each input file as name from the output to be printed.
(?s)
activate PCRE_DOTALL, which means that '.' finds any character or newline
Solution 5:
Using p to print as simple:
sed -n '/abc/,/efg/p' file
Solution 6:
Using Perl.
perl -ne 'if (/abc/) { $abc = 1; next }; print "Found in $ARGV\n" if ($abc && /efg/); }' yourfilename.txt
Single regular expression an involves taking the entire contents of the file into a single string.
perl -e '@lines = <>; $content = join("", @lines); print "Found in $ARGV\n" if ($content =~ /abc.*efg/s);' yourfilename.txt