grep常見用法


第1章 grep選項

1.1 選項列表

選項

含義

-c

只輸出匹配行的計數

-i

不區分大小寫

-h

查詢多文件時不顯示文件名

-l

查詢多文件時只輸出包含匹配字符的文件名

-n

顯示匹配行及行號

-w

只選擇含有能組成完整的詞的匹配的行

-v

顯示不包含匹配文本的所有行

-A NUM

打印出緊隨匹配的行之后的下文 NUM 行

-B NUM

打印出匹配的行之前的上文 NUM 行

-C NUM

打印出匹配的行的上下文前后各 NUM 行

-m NUM

在找到NUM個匹配的行之后,不再讀這個文件

-R/-r

遞歸地讀每一目錄下的所有文件

-R/-r --include=PATTERN    

僅僅在搜索匹配PATTERN的文件時在目錄中遞歸搜索

-R/-r --exclude=PATTERN

在目錄中遞歸搜索,但是跳過匹配PATTERN的文件

1.2 常用選項

假設有文件datafile,其內容如下:

$cat datafile

47 Oct 3zl1998 LPSX 43.00 kvm90 512

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

1.2.1 使用頻率較高的常用選項

1.2.1.1 -v過濾匹配的行

-v 顯示不包含匹配文本的所有行。

示例:查找datafile文件中不包含“CAD”的所有行:

$grep -v "CAD" datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

483 MAY 5PA1998 USP 37.00 KVM90 644

47 Oct 3zl1998 LPSX 43.00 kvm90 512

1.2.1.2 -l輸出匹配的文件名

-l 查詢多文件時只輸出包含匹配字符的文件名,而不輸出文本行。

示例:查找包含字符串“LPSX”的文件名:

$grep -l "LPSX" *

datafile

1.2.1.3 -i 忽略大小寫

-i 關閉大小寫敏感性。

示例,查找含有“sep”這三個字符的行,並且不區分大小寫:

$grep -i "sep" datafile

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

注:該表達式中sep包含任意大小寫的組合都符合。

1.2.1.4 -n顯示匹配行及行號

-n 顯示匹配行及行號。

示例:查找datafile文件中含有“CAD”的所有行,並顯示行號:

$grep -n "CAD" datafile

2:219 Dec 2cc1999 CAD 23.00 PLV2C68

5:484 nov 7pl1996 CAD 49.00 PLV2C234

1.2.2 其他常用選項

1.2.2.1 -c 輸出匹配行的行數

-c 只輸出匹配行的計數。

示例:查找datafile文件中包含字符串“CAD”的行數:

$grep -c "CAD" datafile

2

1.2.2.2 -h不顯示文件名

-h 查詢多文件時不顯示文件名。

示例:打印含有字符串”Oct”所在的行內容,並且不顯示其文件名:

$grep -h "Oct" *

47 Oct 3zl1998 LPSX 43.00 kvm90 512

1.2.2.3 -w輸出完整匹配的行

-w 只選擇含有能組成完整的詞的匹配的行。

示例:打印完整組成“se”所在的行內容:

$grep "se" datafile

216 sept 3zl1998 usp 86.00 kvm9m234

$grep -w "se" datafile

1.3 其他選項

1.3.1 打印匹配行的上下文

l         -A NUM, --after-context=NUM

打印出緊隨匹配的行之后的下文 NUM 行。在相鄰的匹配組之間將會打印內容是 -- 的一行。

l         -B NUM, --before-context=NUM

打印出匹配的行之前的上文 NUM 行。在相鄰的匹配組之間將會打印內容是 -- 的一行。

l         -C NUM, --context=NUM

打印出匹配的行的上下文前后各 NUM 行。在相鄰的匹配組之間將會打印內容是 -- 的一行。

1.3.2 打印指定的匹配行數

l         -m NUM, --max-count=NUM

在找到NUM個匹配的行之后,不再讀這個文件。如果輸入是來自一個普通文件的標准輸入,並且已經輸出了NUM個匹配的行,grep保證標准輸入被定位於退出時的最后一次匹配的行之后,不管是否指定了要輸出緊隨的下文的行。grep在NUM個匹配的行之后停止,它會輸出任何緊隨的下文的行。

1.3.3 遞歸模式匹配查找

l         -R/-r       遞歸地讀每一目錄下的所有文件;

l         -R/-r --include=PATTERN 僅僅在搜索匹配PATTERN的文件時在目錄中遞歸搜索;

l         -R/-r --exclude=PATTERN  在目錄中遞歸搜索,但是跳過匹配PATTERN的文件。

示例:grep忽略svn文件

1、使用管道進行雙層“過濾”,其中第二次grep使用了-v選項,即逆向匹配,打印出不匹配的行,如下:

$grep -r 'function_name' * | grep -v '.svn'

2、直接使用--exclude-dir選項,即指定排除目錄,注意svn前的 \.如下:

$grep -r --exclude =\.svn 'function_name' *

1.3.3.1 顏色標識查找結果

l         --color:將找到的字符串以特殊顏色顯示

第2章 grep+正則表達式

使用正則表達式使模式匹配加入一些規則,因此可以在抽取信息中加入更多選擇。使用正則表達式時最好用單引號括起來,這樣可以防止grep中使用的專有模式與一些shell命令的特殊方式相混淆。

2.1 正則表達式常用元字符

元字符

釋義

^

只匹配行首

只匹配行尾

一個單字符后緊跟*,匹配0個或多個此單字符

[ ] 

匹配[ ]內字符。可以是一個單字符,也可以是字符序列。可以使用-表示[ ]內字符序列范圍,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]

用來屏蔽一個元字符的特殊含義。因為有時在shell中一些元字符有特殊含義。\可以使其失去應有意義

[^]

匹配不在指定字符組內的字符

\<

詞首定位符

\>

詞尾定位符

.

匹配任意單字符

x\{n\}

用來匹配字符x重復出現次數。n為次數

x\{n,\}

用來匹配字符x重復出現次數,但次數最少為n

x\{n,m\}

用來匹配字符x重復出現次數,但字符x出現次數在n與m之間

2.2 含有正則表達式的grep

假設有文件datafile:

$cat datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CADD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

47" Oct 3zl1998 LPSX 43.00 kvm90 512

2.2.1 字符匹配

示例:打印含有“CAD”字符串的所有行:

$grep 'CAD*' datafile

219 Dec 2cc1999 CADD 23.00 PLV2C68

484 nov 7pl1996 CAD 49.00 PLV2C234

示例:打印以“CADD”開頭的字符串的所有行:

$grep '\<CADD' datafile

219 Dec 2cc1999 CADD 23.00 PLV2C68

示例:打印以“CAD”結尾的字符串的所有行:

$grep 'CAD\>' datafile

484 nov 7pl1996 CAD 49.00 PLV2C234

2.2.2 匹配特殊字符

\ 用來屏蔽一個元字符的特殊含義。因為有時在shell中一些元字符有特殊含義,\可以使其失去應有意義。

$grep \" datafile

47" Oct 3zl1998 LPSX 43.00 kvm90 512

$grep " datafile

2.2.3 范圍組合

示例:打印以任意字符開始,第二位的范圍為0-5,第三位的范圍為5-9的字符串所在的行:

$grep '.[0-5][5-9]' datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

47" Oct 3zl1998 LPSX 43.00 kvm90 512

示例:打印以任意字符開始,第二位的范圍為0-5,第三位的范圍為5-9的並且處於行尾位置的三位數所在的行:

$grep '.[0-5][5-9]$' datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

示例:打印以任意字符開始,第二位的范圍不為0-5,第三位的范圍為0-5的並且處於行首位置的三位數所在的行:

$grep '^.[^0-5][0-5]' datafile

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

示例:打印以任意字符開始,第二位的范圍為0-5,第三位的范圍為0-5的並且處於行首位置的三位數所在的行:

$grep '^.[0-5][5-9]' datafile

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

2.2.4 模式出現幾率

示例:打印重復出現2次數字4所在的行:

$grep '4\{2\}' datafile

483 MAY 5PA1998 USP 37.00 KVM90 644

示例:打印至少重復出現3次數字9所在的行:

$grep '9\{3,\}' datafile

219 Dec 2cc1999 CAD 23.00 PLV2C68

示例:打印重復出現數字9的2到3次的行:

$grep '9\{2,3\}' datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

47 Oct 3zl1998 LPSX 43.00 kvm90 512

2.2.5 匹配“與”或“或”模式

grep命令加- E參數,這一擴展允許使用擴展模式匹配。例如,要抽取219或216 所在的行,方法如下:

$grep -E "219|216" datafile

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

第3章 grep分類簡述

grep家族由命令grep、egrep、fgrep組成。grep命令在文件中全局查找指定的正則表達式,並且打印所有包含該表達式的行。

  1. grep有兩種版本:一種是標准的grep版本;另一種是擴展的 linux GNU grep。
  2. egrep是擴展的grep,支持更多的正則表達式元字符;

字符

釋義

+

匹配一個或多個先前的字符,例如:’[a-z]+able’,則匹配一個或多個小寫字母后跟able的串:loveable,enable,disable等

?

匹配零個或多個先前的字符,例如:’gr?p’,則匹配gr后跟一個或沒有字符,然后是p的行

a|b|c

匹配a或b或c,例如:(grep)|(sed),則匹配grep或sed

()

分組符號,如:love(able|rs)ov+,則匹配loveableov或loversov

  1. fgrep被稱為固定的grep(fixed grep),它按字面解釋所有的字符。即正則表達式元字符不會被特殊處理,它們只匹配自己。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM