MoonPoint Support Logo


Shop Amazon Warehouse Deals - Deep Discounts on Open-box and Used ProductsAmazon Warehouse Deals

Advanced Search
Sun Mon Tue Wed Thu Fri Sat

Wed, Mar 23, 2016 10:34 pm

Excluding multiple patterns with grep

If you wish to exclude lines containing a specified pattern when using the grep command on a Unix, Linux, or OS X system, you can do so using the -v or --invert-match. option.

-v, --invert-match
       Invert the sense of matching, to select non-matching lines.  (-v
       is specified by POSIX.)

E.g., suppose I have a file names.txt containing the following names:

$ cat names.txt
John Smith
Paul McCartney
Bob Jones
Allen Smith
Greg Smith
Bob Smith
Carl Smith
John Doe

If I want to view all lines except for those containing "Allen", I can use grep -v "Allen" names.txt. But what if I want to exclude more than one pattern, e.g. any line containing "Allen" or "Bob". I could pipe the output of one grep command to another grep command with grep -v "Allen" names.txt | grep -v "Bob". Or you can perform a logical disjunction using the "pipe" character, i.e., "|", aka a "vertical bar".

$ grep -v "Allen\|Bob" names.txt
John Smith
Paul McCartney
Greg Smith
Carl Smith
John Doe

In the above example, I am instructing grep to ignore any lines containing either Allen or Bob in the line. Because the pipe character has another meaning to the Bash shell, i.e., it is used by the shell to "pipe" the output of one command to another with the output of the first command becoming the input of the second, its meaning must be "escaped" to be processed by grep as a logical disjunction symbol. That is done by preceding the character with a backslash, which is an escape character.

[/os/unix/commands] permanent link

Valid HTML 4.01 Transitional

Privacy Policy   Contact

Blosxom logo