Linux 命令 ‘grep’ 的或与非

导语

grep, print lines matching a pattern。 本文是翻译文章,翻译自 grep-or-and-not-operators。
习惯了英文者,可自行前往阅读。

对于‘grep’,我们有OR和NOT操作符,却没有AND。不过,我们可以模拟一个。下面的例子会帮助你弄懂如何在Linux ‘grep’命令中使用OR、AND和NOT。

employee.txt 文件会在接下来的例子中使用。
$ cat employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy Manager Sales $6,000

1. ‘grep’ OR

这里有4种方法可以实现‘grep’ OR 。我更倾向于第三种。

1.1 ‘gerp’ OR 使用 '|'

如果你使用 ‘grep’ 命令不带任何选项,你需要使用 ‘|’ 来作OR条件的分隔符。

grep 'pattern1\|pattern2' filename

比如,你想打印出employee.txt中的TachSales。没有 ‘\’ 在 ‘|’ 之前,下面的命令是没有用的。

$ grep 'Tech\|Sales' employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000 500 Randy Manager Sales $6,000

1.2 ‘gerp’ OR 使用 ‘-E’

‘grep’ ‘-E’ 选项表示使用扩展的正则表达式。如果你使用 ‘grep’ 命令时带 ‘-E’,你只需要用途 ‘|’ 来分隔OR条件。

grep -E 'pattern1|pattern2' filename

打印出employee.txt中的TachSales

$ grep -E 'Tech|Sales' employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000 500 Randy Manager Sales $6,000

1.3 ‘gerp’ OR 使用 ‘egrep’

‘egrep’ 就是 ‘grep -E’。所以

$ egrep 'Tech|Sales' employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000 500 Randy Manager Sales $6,000

1.4 ‘gerp’ OR 使用 ‘grep -e’

使用 ‘grep -e’ 选项你仅可以传递一个参数。在一个命令中使用多个 ‘-e’ 选项可以指定多个OR条件。Example:

$ grep -e Tech -e Sales employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000 500 Randy Manager Sales $6,000

2. ‘grep’ AND

‘grep’ 命令没有 AND 操作符。但是,上文说了,我们可以模拟它。

2.1 ‘grep’ AND 使用 ‘-E pattern1.*pattern2’

grep -E 'pattern1.*pattern2' filename grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

Example:

$ grep -E 'Dev.*Tech' employee.txt 200 Jason Developer Technology $5,500

2.2 ‘grep’ AND 使用多个 ‘grep’ 命令

你还可以使用多个 ‘grep’ 命令加管道(pipe)的方式来实现 AND 操作。

grep -E 'pattern1' filename | grep -E 'pattern2'

Example:

$ grep Manager employee.txt | grep Sales 100 Thomas Manager Sales $5,000 500 Randy Manager Sales $6,000

3. ‘grep’ NOT

使用 ‘grep -v’ 你可以模拟NOT操作。

-v, --invert-match
Invert the sense of matching, to select non-matching lines.

使用 ‘-v’ 选项来反向匹配,选择不匹配的行。

grep -v 'pattern1' filename

举个例子,打印出所有不包含关键词 “Sales” 的 行:

$ grep -v Sales employee.txt 200 Jason Developer Technology $5,500 300 Raj Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500

你可能感兴趣的:(Linux 命令 ‘grep’ 的或与非)