文本三劍客之grep及正則表達式用法

grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,與sed(文本過濾工具),awk(文本報告生成器)并稱為Linux文本處理三劍客,它能使用特定模式匹配(包括正則表達式)搜索文本,并默認輸出匹配行。

本節索引

一、文本三劍客之grep介紹

二、正則表達式的相關概念

三、基本正則表達式(BER)

四、拓展正則表達式(ERE)

五、正則表達式中的元字符與通配符的使用區別

 

timg_image&quality=80&size=b9999_10000&sec=1523187795674&di=cac36899b69d5639ae19

 

一、文本三劍客之grep介紹:

grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用特定模式匹配(包括正則表達式)搜索文本,并默認輸出匹配行。

 

Linux文本處理三劍客:

grep:文本過濾工具

sed:文本編輯工具(傳送門)

awk:Linux上的實現gawk,文本報告生成器(傳送門)

 

grep,基于行過濾的文本過濾工具

格式:

grep [OPTION]… PATTERN [FILE]…

option:

-v???? 顯示不被匹配到的行

-i????? 忽略字符大小寫

-n???? 添加匹配到的行的行號

-c???? 統計被匹配到的行數

-o???? 僅顯示匹配到的字符

-q???? 靜默模式

-A#?? 包含此匹配行和后#行

-B#?? 包含此匹配行和前#行

-C#?? 包含此匹配行和前后#行

-e???? 實現多個匹配字符的或者(or)關系 -e a -e b:a或b

-w??? 匹配整個單詞,數字、字母、下劃線都算單詞一部分

-r????? 遞歸目錄

-E???? 使用ERE,擴展的正則表達式

-F???? 相當于fgrep

 

grep工具之所以功能強大,是因為它支持正則表達式進行匹配,那什么又是正則表達式呢?

 

二.正則表達式的相關概念

1.正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。元字符使正則表達

式具有處理能力。所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規

定其前導字符(即位于元字符前面的字符)在目標對象中的出現模式

正則表達式(REGEXP):由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不

表示字符表面意義,而表示控制或通配功能

 

2.正則表達式與通配符的區別:通配符匹配的是文件名中的字符,不能匹配文件的文本內容的字符

串(詳見前篇:帶你認識Linux中的通配符),這時候就需要用到正則表達式。

 

 

3.正則表達式分兩類:

基本正則表達式:BRE;只承認的元字符有^$.[]*其他字符識別為普通字符:\(\)需要轉義

擴展正則表達式:ERE;則添加了(){}?+|等

grep -E,egrep

 

4.正則表達式引擎:

采用不同算法,檢查處理正則表達式的軟件模塊

基于PCRE語言(逐漸沒落)兼容的正則表達式

 

5.元字符分類:字符匹配、匹配次數、位置錨定、分組(幫助文檔:man 7 regex)

 

三、基本正則表達式(BRE)的元字符介紹:

1.字符匹配:

.??????? 匹配任意單個字符,放在[]中就表示點

[]????? 匹配括號內任意單個字符

[^]??? 匹配指定范圍外的任意單個字符

[:alnum:] 任意一個字母和數字

[:alpha:]? 任意一個字母

[:lower:]? 任意一個小寫字母

[:upper:]? 任意一個大寫字母

[:digit:]??? 任意一個數字

[:space:]? 水平或垂直空白字符

[:punct:]? 標點符號

注意:正則表達式使用字符集作為搜索條件時,一定要加雙引號,如”[[:digit:]]”;否則正則表達式會將字符集作為一個個字符進行識別

轉義符“\”使正則表達式中具有特殊含義的字符顯示其本身,如\.只表示小數點

 

2.匹配次數(某個字符出現的次數)

*?????? 匹配前面的字符任意次,包括0次(貪婪模式,盡可能長的匹配)

.*???? 任意長度的任意字符

\??? 匹配前面的字符0或1次,可看做 \{0,1\}

\+???? 匹配前面的字符至少1次,可看做\{1,\}(可實現懶惰模式)

\{m\}??????? 精確匹配前面的字符m次

\{m,\}?? 至少匹配前面的字符m次

\{,m\}????? 至多匹配前面的字符m次

\{m,n\}匹配前面的字符m到n次

 

3.位置錨定

^?????? 行首錨定,用于模式最左側

$?????? 行尾錨定,用于模式最右側

^$??? 表示空行

\<或\b???? 單詞的詞首錨定

\>或\b???? 單詞的次尾錨定

\<word\> 匹配整個單詞,同grep -w

 

4.分組

\(\)將一個或多個字符捆綁在一起,當做一個整體進行處理,如:\(root\)\+

分組括號中匹配到的內容會被正則表達式記錄與內部變量中,這些變量命名方式

為:\1,\2,\3,…

\1表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符

 

后向引用:\1表示的是前面匹配的結果而不是前面匹配的模式

例:echo rootxxrbbt|grep ‘\(r..t\).*\1’

\1代表root,而不是r..t

 

5.或者:\|

例:a\|b:a或b; C\|cat:C或cat \(C\|c\)at:Cat或cat

 

 

四、擴展正則表達式(ERE)元字符介紹:

egrep ? ? ?同grep -E

擴展正則表達式(ERE)可理解為將基礎正則表達式中的轉義符全部去掉,其字符匹配與基礎正則表達式(BRE)相同。

1.次數匹配:

*?????? 匹配前面字符任意次

???? 0或1次,可看做{0,1}

+?????? 1次或多次.可看做{1,}

{m}? 匹配m次

{m,n}??????? 匹配m到n次

 

2.位置錨定:

^?????? 行首

$?????? 行尾

\<,\b??????? 語首

\>,\b ????? 語尾

 

3.分組:

()

后向引用:\1,\2,…

 

4.或者:

a|b? a或b

C|cat?????? C或cat

(C|c)at?????? Cat或cat

 

五、正則表達式中的元字符與通配符的區別

作用不同:通配符匹配的是文件名中的字符,而正則表達式匹配的是文件的文本內容的字符串;

兩者之間有很多相同之處,也有不同點,其中:

1.正則表達式元字符與通配符代表意義不同的有:

通配符中:

* 表示任意長度的任意字符

? 表示任意一個單個字符

正則表達式:

*表示匹配前面的字符任意次

. 表示匹配任意一個單個字符

.*表示任意長度的任意字符

 

2.正則表達式元字符與通配符含義相似的有:

[]????? 匹配括號內任意單個字符

[^]??? 匹配指定范圍外的任意單個字符

[:alnum:] 任意一個字母和數字

[:alpha:]? 任意一個字母

[:lower:]? 任意一個小寫字母

[:upper:]? 任意一個大寫字母

[:digit:]??? 任意一個數字

[:space:]? 水平或垂直空白字符

[:punct:]? 標點符號

…等字符集

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95103

(6)
wangxczwangxcz
上一篇 2018-04-07
下一篇 2018-04-07

相關推薦

  • Linux基礎命令與bash基礎特性

    第二周作業

    2018-05-19
  • N31第一周作業

    本周(6.18–6.24)第1周 1、描述計算機的組成及其功能。 計算機組成:硬件系統和軟件系統 硬件系統:CPU:運算器和寄存器(運算器負責算術、邏輯等運算、控制器是系統的控制中心) 存儲器:主要為內存,功能是存儲程序和各種數據信息。 Input:下指令、提供數據到計算機,常用的輸入設備有鼠標、鍵盤、掃描儀等 Output:輸出加工的結果,常用…

    Linux筆記 2018-06-25
  • linux基礎知識

    1、描述計算機的組成及其功能。 計算機由運算器、控制器、存儲器、輸入設備、輸出設備五大部分組成: (1)運算器是完成各種算術運算和邏輯運算的裝置,能進行加、減、乘、除等數學運算,也能作比較、判斷、查找、邏輯運算等。 (2)控制器是計算機機指揮和控制其它各部分工作的中心,其工作過程和人的大腦指揮和控制人的各器官一樣??刂破魇怯嬎銠C的指揮中心,負責決定執行程序的…

    2018-06-18
  • shell腳本進階-課后練習題答案

    答案不唯一,不足之處請各位大佬多多支教

    2018-05-05
  • Linux基礎和幫助

    多動手,勤思考

    2018-03-31
  • Ansible使用介紹(二)YAML語法及Playbook

    playbook是由一個或多個”play”組成的列表,play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansibe中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的module。將多個play組織在一個playbook中,即可讓它們聯同起來按事先編排的機制運行。

    2018-05-30

評論列表(1條)

  • M30-Alvin阿峰
    M30-Alvin阿峰 2018-04-16 11:33

    grep ‘^$’ f1 | wc -l
    grep -c ‘^$’ f1
    上面兩個是等價寫法

欧美性久久久久