grep命令

grep命令很是強大,平時也常常使用grep命令來搜索。這裏記錄最經常使用的grep命令正則表達式

一.經常使用的grep命令

1. grep -w

grep -w表示匹配一個完整的單詞,而不是經常使用的模糊匹配。好比有以下內容:日誌

$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 "Tho"能匹配出第一行,例如:blog

$grep "Tho" employee.txt
100  Thomas  Manager    Sales       $5,000

但grep -w "Tho" 不能匹配到:get

$grep -w "Tho" employee.txt  

由於grep -w 是完整單詞匹配,而在employee.txt中不存在一個完整的單詞"Tho"(存在完整的單詞"Thomas"),例如:class

$grep -w "Thomas" employee.txt
100  Thomas  Manager    Sales       $5,000

有時咱們想精確匹配,那麼grep -w就派上用場了.file

 

2. grep -v

有這樣的場景:過濾出除了包含某某關鍵字的其餘全部行 ,這時就能夠用grep -v了.搜索

過濾出不包含"Manager"的行,結果以下:grep

$grep -v "Manager" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

 

3. grep -e

若是想在一行命令中過濾出多個關鍵字,即過濾出包含關鍵A, 或者包含關鍵字B這樣的場景時,就可使用grep -e.查詢

例如,過濾出包含"Tech"的行,或者包含"Sales"的行,則命令以下:樣式

$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

 

4. grep -E

grep -E可使用正則表達式來過濾出你想要的內容。

使用grep -E時,若是想匹配多個模式,則使用「|」來分隔。即:

grep -E "pattern1|pattern2" file

例如,一樣實現過濾出包含"Tech"的行,或者包含"Sales"的行的要求,可使用grep -E來實現:

$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

  

5. grep -vxf

我經常使用這個命令,來匹配出兩個文件的差別:

grep -vxf file1 file2

查詢在file2中的行,但不在file1中的行,就是file2比file1多出來的行。

 

6. grep -A、grep -C、 grep -B

有時排查線上問題時,咱們能扎到異常日誌,但若是要知道問題,還要看上下文日誌,這時就可使用grep -A, -B, -C了

grep -A 10 將關鍵字所在行的後10行也打印出來(After)

grep -B 10 將關鍵字所在行的前10行打印出來(Before)

grep -C 10 將關鍵字所在行的先後10行都打印出來

 

7. grep -o

grep -o表示僅輸出匹配的內容, 什麼意思呢?看下面例子就知道了.

$grep "Manager" employee.txt
100  Thomas  Manager    Sales       $5,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   Manager    Sales       $6,000

$grep -o "Manager" employee.txt
Manager
Manager
Manager

  

8. grep -i

grep -i表示忽略大小寫。

$grep "manager" employee.txt
$grep -i "manager" employee.txt 100 Thomas Manager Sales $5,000 400 Nisha Manager Marketing $9,500 500 Randy Manager Sales $6,000

  

9. grep -f

grep -f 指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式爲每行一個規則樣式.

例如,我想查找以下這些人的信息, 人名存在names.txt文件中:

$cat name.txt
Thomas
Jason

 如今可使用grep -f來查找了:

$grep -f name.txt employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500

 也能夠用另一種方式實現一樣的功能:

$cat name.txt | xargs -I {} grep {} employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500

  

二.附加命令

上面都是經常使用命令. 有時我想要這樣的功能:匹配出同時包含多個關鍵字的內容。grep 也能夠實現.

1. grep and 操做

使用-E "pattern1.*pattern2"能夠實現 and操做,例如:

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

 上面匹配順序是指定的,若是grep -E "Tech.*Dev"是匹配不出任何內容的。

若是但願順序是不固定的,能夠這樣:

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

  

2. grep or 操做

這個其實上面說過了, 

若是不使用 -E, 則必須轉義"|", 即 grep "pattern1\|pattern2", 例如:

$grep "Tech\|Dev" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

 

若是使用-E,則不用使用轉義符"\", 例如:

$grep -E "Tech|Dev" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

  

在經常使用命令中,咱們介紹了-e, 其實使用-e一樣能夠實現grep or 操做。

$grep -e "Tech" -e "Dev" employee.txt
200  Jason   Developer  Technology  $5,500
300  Raj     Sysadmin   Technology  $7,000

  

3. grep not操做

grep -v 就能夠實現grep not操做,例如:

$egrep 'Manager|Developer' employee.txt | grep -v Sales

  

參考文章:https://www.jianshu.com/p/4ec50fdaf388

相關文章
相關標籤/搜索