导语
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中的Tach和Sales。没有 ‘\’ 在 ‘|’ 之前,下面的命令是没有用的。
$ 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中的Tach和Sales:
$ 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