The grep
, egrep
, sed
and awk
are the most common Linux command line tools for parsing files.
From the following article you’ll learn how to match multiple patterns with the OR
, AND
, NOT
operators, using grep
, egrep
, sed
and awk
commands from the Linux command line.
I’ll show the examples of how to find the lines, that match any of multiple patterns, how to print the lines of a file, that match each of provided patterns and how to find and print the lines, that do not match a pattern (negative matching).
Cool Tip: Find and validate email addresses with grep
command! The best regular expression for email addresses! Read more →
GREP OR: Match Any Of Multiple Patterns
Find all the lines of a file, that match any of provided patterns.
Using grep
and egrep
commands:
$ grep "PATTERN1\|PATTERN2" FILE $ grep -E "PATTERN1|PATTERN2" FILE $ grep -e PATTERN1 -e PATTERN2 FILE $ egrep "PATTERN1|PATTERN2" FILE
Using awk
command:
$ awk '/PATTERN1|PATTERN2/' FILE
Using sed
command:
$ sed -e '/PATTERN1/b' -e '/PATTERN2/b' -e d FILE
GREP AND: Match Multiple Patterns
It is also often required to grep
a file for multiple patterns – when it is needed to find all the lines in a file, that contain not one, but several patterns.
Note, that you can both find the lines in a file that match multiple patterns in the exact order or in the any order.
Use one of the following commands to find and print all the lines of a file, that match multiple patterns.
Using grep
command (exact order):
$ grep -E 'PATTERN1.*PATTERN2' FILE
Using grep
command (any order):
$ grep -E 'PATTERN1.*PATTERN2|PATTERN2.*PATTERN1' FILE $ grep 'PATTERN1' FILE | grep 'PATTERN2'
Cool Tip: The server is out of memory? Check what processes are using all the RAM and SWAP! Bash one liner for the true Linux admins! Read more →
Using awk
command (exact order):
$ awk '/PATTERN1.*PATTERN2/' FILE
Using awk
command (any order):
$ awk '/PATTERN1/ && /PATTERN2/' FILE
Using sed
command (exact order):
$ sed '/PATTERN1.*PATTERN2/!d' FILE
Using sed
command (any order):
$ sed '/PATTERN1/!d; /PATTERN2/!d' FILE
GREP NOT: Negative Matching
Cool Tip: Find and validate IP addresses with grep
command! The best regular expression for IP addresses! Read more →
Find and print all the lines, that do not match a pattern.
Using grep
command:
$ grep -v 'PATTERN1' FILE
Using awk
command:
$ awk '!/PATTERN1/' FILE
Using sed
command:
$ sed -n '/PATTERN1/!p' FILE
$ grep ‘PATTERN1’ FILE | grep ‘PATTERN2’ works under csh but not under bash
grep mynetworks /etc/postfix/main.cf | grep #
Usage: grep [OPTION]… PATTERN [FILE]…
Try ‘grep –help’ for more information.
You can certainly pipe grep into another grep in bash. In your case, you need to escape the octothorp (#) or surround it with quotes. All of the following will work in bash:
grep mynetworks /etc/postfix/main.cf | grep \#
grep mynetworks /etc/postfix/main.cf | grep “#”
grep mynetworks /etc/postfix/main.cf | grep ‘#’
grep mynetworks /etc/postfix/main.cf | grep “#”
it is helpfull
A nice summary that covers all use cases… thank you!