Linux命令:grep命令AND、OR、NOT例項

劉近光發表於2018-08-02

簡介

在grep中,我們有相當於OR和NOT運算子的選項,但沒有AND運算子。但是,我們可以使用模式來模擬AND。在本文的例子將有助於理解如何使用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

Grep OR操作符

可以使用下面提供的4種方法來實現grep OR功能。

1. 使用“\|”

如果使用不帶任何選項的grep命令,則需要使用"\|"來分隔條件OR的多個模式。

grep 'pattern1\|pattern2' filename

例如,grep來自employee.txt檔案的Tech或Sales。如果分隔符|前沒有反斜槓,則以下操作無效。

[jinguang1@localhost ~]$ grep "Tech|Sales" employee.txt
[jinguang1@localhost ~]$ 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

2. 使用-E選項

grep -E選項用於擴充套件正規表示式。如果使用帶-E選項的grep命令,則只需使用|為條件OR來分隔多個模式。
grep -E 'pattern1|pattern2' filename

例如,grep來自employee.txt檔案的Tech或Sales。僅使用“|”來作為多個模式。

[jinguang1@localhost ~]$ 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

3. 使用egrep

egrep和grep -E功能完全相同。

egrep 'pattern1|pattern2' filename

例如,grep來自employee.txt檔案的Tech或Sales。僅使用“|”來作為多個模式。

[jinguang1@localhost ~]$ 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

4. 使用grep -e

使用grep -e選項,你僅能使用一個引數。如果要使用多個模式,則需要在命令中提供多個-e選項。

grep -e pattern1 -e pattern2 filename

例如,grep來自employee.txt檔案的Tech或Sales。使用多個-e選項來支援多個OR模式。

[jinguang1@localhost ~]$ 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

Grep AND

1. 使用-E "pattern1.*pattern2"

grep中並沒有AND操作符,但你可以使用-E選項來模擬。

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

下面的例子將grep所有同時包含“Dev”和"Tech"的行,並且保持包含字串的相應順序。

[jinguang1@localhost ~]$ grep -E "Dev.*Tech" employee.txt
200  Jason   Developer  Technology  $5,500

下面的例子將grep所有包含“Manager"和"Sales"的行,且這個字串可以以任意順序出現。

[jinguang1@localhost ~]$ grep -E "Manager.*Sales|Sales.*Manager" employee.txt
100  Thomas  Manager    Sales       $5,000
500  Randy   Manager    Sales       $6,000

2. 使用多個grep命令

可以使用管道來連線多個grep命令來模擬AND操作符。

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

下面的例子將grep所有包含“Manager"和"Sales"的行,且這個字串可以以任意順序出現。

[jinguang1@localhost ~]$ grep Manager employee.txt | grep Sales
100  Thomas  Manager    Sales       $5,000
500  Randy   Manager    Sales       $6,000

Grep NOT

使用grep -v選項可以模擬NOT操作符。-v選項為相反匹配設計,它可以match所有不包含指定模式的行。

grep -v 'pattern1' filename

下面的例子中將顯示所有不包含“Sales”關鍵字的行。

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

下面的例子中將顯示所有的Manager和Developer,但忽略Sales。

[jinguang1@localhost ~]$ grep -E "Manager|Developer" employee.txt | grep -v Sales
200  Jason   Developer  Technology  $5,500
400  Nisha   Manager    Marketing   $9,500

 

相關文章