詳解grep命令


1、grep命令行的一般語法格式為:

grep 【OPTIONS】 PATTERN INPUT_FILE_NAMES

  grep是一種匹配盡可能多的一種匹配模式,“貪婪模式”

  PATTERN部分表示正則表達式

正則表達式又由普通字符和元字符組成,元字符的依據分類也可以分為:

次數限制元字符:

*表示任意多次;

?表示一次或者零次

+表示大於或者等於一次

{}表示指定范圍次數,{n,m}{n,}{,m}{n,n}

位置錨定元字符:

^表示必定以其后面所跟字符開頭

$表示必定一起前面所跟字符結尾

\<\>表示單詞邊界字符

字符類和中括號表達式

中括號正則表達式是使用"["和"]"包圍的字符列表。它能匹配該列表中的任意單個字符。如果列表中的第一個字符是"^",則表示不匹配該列表中的任意單個字符。例如,'[0123456789]'能匹配任意數字。

中括號中可以使用連字符"-"連接兩個字符表示"范圍"。例如,C字符集下的"[a-d]"等價於"[abcd]"。大多數字符集規則和字典排序規則一樣,這意味着"[a-d]"不等價於"[abcd]",而是等價於"[aBbCcDd]"。可以設置環境變量"LC_ALL"的值為C使得采取C字符集的排序規則。

最后,預定義了幾個特定名稱的字符類,它們都使用中括號包圍。如下:

'[:alnum:]'
匹配大小寫字母和數字。等價於字符類'[:alpha:]'與字符類'[:digit:]'的和。

'[:alpha:]'
字母字符類。匹配大小寫字母。等價於字符類'[:lower:]'和字符類'[:upper:]'的和。

'[:blank:]'
空白字符類。包括:空格和制表符。

'[:cntrl:]'
控制字符類。在ASCII中,這些字符的八進制代碼從000到037,還包括177(DEL)。

'[:digit:]'
數字字符類。包括:'0 1 2 3 4 5 6 7 8 9'。

'[:graph:]'
繪圖類。包括:大小寫字母、數字和標點符號。等價於

'[:lower:]'
小寫字母類。包括:'a b c d e f g h i j k l m n o p q r s t u v w x y z'。

'[:print:]'
打印字符類。包括:大小寫字母、數字、標點符號和空格。等價於字符類'[:alnum:]'與字符類'[:punct:]'和空格的和。

'[:punct:]'
標點符號類。包括:'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'。

'[:space:]'
空格字符類。包括:空格、制表符、垂直制表符、換行符、回車符和分頁符。

'[:upper:]'
大寫字母類。包括:'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'。

'[:xdigit:]'
十六進制類。包括:'0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'。

例如,"[[:alnum:]]"表示"[0-9A-Za-z]","[^[:digit:]]"表示[^0123456789],"[ABC[:digit:]]"表示"[ABC0-9]"。注意,字符類必須包含在額外的中括號內。

中括號中的大多數元字符都丟失了它們特殊意義,而成為普通的字面符號。

']'
該符號表示中括號的結束。如果要匹配該字面字符,則必須將其放在字符列表的最前面。即"[]...]"。

'[.'
該符號表示排序符號的開始。
(注:排序類需要在字符集中預先定義好才能使用。例如[.ab.]表示將“ab”作為整體匹配,不匹配a或b。但默認情況下,字符集里肯定是沒有定義好"ab"這個排序整體的,所以無法使用)

'.]'
表示排序符號的結束。

'[='
表示等價類的開始。
(注:例如,[=e=]表示將字母e的第一聲和第三聲等不同音節的同字母看成相同字符。)

'=]'
表示等價類的結束。

'[:'
表示字符類的開始。

':]'
表示字符類的結束。

'-'
該字符是范圍連接符,因此要匹配該符號的字面意義,需要將其放在列表的最前面或最后面或作為范圍的結束字符。

'^'
該字符表示不在列表中的字符。如果想匹配該字符的字面意義,則必須不能放在列表的第一個字符。

字符分組和引用:

()

其他元字符:

.

代表任意字符

'\w'
匹配單詞成分的字符。是[_[:alnum:]]的同義詞。

'\W'
匹配非單詞成分的字符,是[^_[:alnum:]]的同義詞。

'\s'
匹配空白字符,是[[:space:]]的同義詞。

'\S'
匹配非空白字符,是[^[:space:]]的同義詞。

2、OPTION

2.1.2 控制匹配模式

'-e PATTERN'
'--regexp=PATTERN'
明確指定使用此處的PATTERN作為待匹配的pattern。該選項可以指定多次,它可以保護以"-"開頭的pattern。('-e'是POSIX指定的選項。)

'-f FILE'
'--file=FILE'
從FILE中獲取pattern列表,每行一個pattern。空的FILE表示不給定任何pattern,所以不會匹配到任何內容。('-f'是POSIX指定的選項。)

'-i'
'-y'
'--ignore-case'
忽略PATTERN中的大小寫,也忽略輸入文件中的大小寫區別。'-y'是廢棄的用於和老版本保持兼容性的選項。('-i'是POSIX指定的選項。)

'-v'
'--invert-match'
反轉匹配的結果,即選擇那些未匹配到的行。('-v'是POSIX指定的選項。)

'-w'
'--word-regexp'
僅選擇能精確匹配整個單詞的行。單詞的組成字符包括:字母、數字和下划線。除了這些字符,其余都是該選項篩選單詞時的單詞邊界分隔符。 (注:例如字符串"fstab fstab(5)",grep -w 'fstab'或grep -w 'fsta.'能匹配這兩個單詞,但grep -w 'fsta'無法匹配任意一個)

'-x'
'--line-regexp'
僅選擇能精確匹配整行內容的行。('-x'是POSIX指定的選項。)
(注:例如某行"abcde",grep -x 'abc'將無法匹配該行,而grep -x 'abcd.'能匹配該行)

2.1.3 控制輸出內容

'-c'
'--count'
不再輸出匹配的內容,而是輸出匹配到的行數量。如果給定了"-v"選項,則輸出未匹配到的行數量。('-c'是POSIX指定的選項。)

'--color[=WHEN]'
'--colour[=WHEN]'
對匹配到的內容賦予顏色並輸出。WHEN的有效值包括:'never'、'always'或'auto'。

'-L'
'--files-without-match'
不再輸出匹配的內容,而是輸出未能被匹配到的文件名,當某文件中的某行被匹配到,將不再繼續向下搜索該文件。
(注:和"-l"輸出的文件名相反)

'-l'
'--files-with-matches'
不再輸出匹配的內容,而是輸出能被匹配到的文件名,當某文件中的某行被匹配到,將不再繼續向下搜索該文件。('-l'是POSIX指定的選項。)

'-m NUM'
'--max-count=NUM'
匹配成功的行有NUM行時,停止讀取文件。如果是普通文件作為標准輸入,則輸出這匹配到的NUM行。grep會在最后一次匹配行后做位置標記,使得調用的另一個進程可以從此處恢復並繼續向下搜索。

'-o'
'--only-matching'
只輸出被匹配到的字符串,而不是輸出整行。每個被匹配到的字符串都使用單獨的行輸出。

'-q'
'--quiet'
'--silent'
靜默模式,立即退出,即使遇到了錯誤。不寫任何內容到標准輸出。如果匹配到了內容則退出狀態碼為0。('-q'是POSIX指定的選項。)

'-s'
'--no-messages'
禁止輸出因文件不存在或文件沒有讀權限而產生的錯誤信息。('-s'是POSIX指定的選項。)

(注:由於POSIX和GNU grep的差異性,在可移植性的腳本中,應盡量避免使用"-q"和"-s",而是使用重定向的方式重定向到/dev/null)

2.1.3 控制輸出行的上下文

無論下面的選項如何設置,grep都不會多次輸出同一行。如果指定了"-o"選項,這些選項將失效,並給出一個警告。

'-A NUM'
'--after-context=NUM'
除了輸出匹配到的行,還輸出匹配到內容的后NUM行。

'-B NUM'
'--before-context=NUM'
除了輸出匹配到的行,還輸出匹配到內容的前NUM行。

'-C NUM'
'-NUM'
'--context=NUM'
除了輸出匹配到的行,還輸出匹配到內容的前NUM行和后NUM行。

2.3 grep各種版本應用場景

有4種grep程序分別支持不同的搜索引擎,使用下面4個選項可以選擇使用哪種grep程序。

'-G'
'--basic-regexp' 使用基礎正則表達式引擎解析PATTERN,因此只支持基礎正則表達式(BRE)。這是默認grep程序。

'-E'
'--extended-regexp'
使用擴展正則表達式引擎解析PATTERN,因此支持擴展正則表達式(ERE)。('-E'是POSIX指定的選項。)

'-F'
'--fixed-strings'
不識別正則表達式,而是使用字符的字面意義解析PATTERN,因此只支持固定字符串的精確匹配。('-F'是POSIX指定的選項。)

'-P'
'--perl-regexp'
使用perl正則表達式引擎解析PATTERN,因此支持Perl正則表達式。但該程序正處於研究測試階段,因此會給出一個警告。

 

 


免責聲明!

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



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