grep: How to match lines using any of multiple patterns
Recently, we needed to filter the results of ps x using two different patterns.
The first pattern was ./ where we needed to match that exact character sequence.
The . period character is treated as a special character in regular expressions (it matches a single character of any value, except for the end of line), so we decided to use the -F parameter to remove this special handling.
Doing this change prevented us from writing a regular expression that uses the OR | operator.
-F (or --fixed-strings) is a matching control option that instructs grep to interpret the patterns as a list of fixed strings (instead of regular expressions), separated by newlines, any of which is to be matched.
We tried assigning the different patterns as different lines to a variable and then using them on the pipe, like in the following example:
patterns="./ banana"; ps x | grep -F $patterns;
..but it failed.
Solution
grep supports a matching control option -e that allows us to define multiple patterns using different strings.
-e PATTERN (or --regexp=PATTERN) uses the value PATTERN as the pattern. If this option is used multiple times or it is combined with the -f (--file) option, grep will search for all patterns given.
In the end, our command was transformed to the following, which worked just fine!
ps x | grep -F -e "./" -e "banana";


