天天看點

shell 正規表達式詳解正規表達式

目錄

正規表達式

一,什麼是正規表達式

二,為什麼使用正規表達式

三,如何使用正規表達式

示例:

四,基本正規表達式

基本正規表達式示例:

正規表達式字元集示例:

五,擴充正規表達式

擴充正規表達式示例:

擴充:

正規表達式

一,什麼是正規表達式

       正規表達式是通過一些特殊字元的排列,用以查找、替換、删除一行或多行文字字元串,簡單的說,正規表達式就是用在字元串的處理上面的一項表示式。由于正規表達式文法簡練,功能強大,得到了許多程式設計語言的支援,包括Java、C++、Perl以及Shell等。

二,為什麼使用正規表達式

        在進行程式設計的過程中,使用者會不可避免地遇到處理某些文本的情況。有的時候,使用者還需要查找符某些比較複雜規則的字元串。對于這些情況,如果單純依靠程式設計語言本身,則往往會使得使用者通過複雜的代碼來實作。但是,如果使用正規表達式,則會以非常簡短的代碼來完成。

三,如何使用正規表達式

       當一個正規表達式完成之後,并能夠保證這個表達式一定是準确的,需要不斷地測試才可以确定其正确 與否。在不同的環境下,使用者需要不同的工具來幫助他完成測試的過程。如果是在Shell指令行中,使用者 可以使用grep指令來測試。

 grep家族有三大成員分别為:

 grep:支援使用基本正規表達式。

 egrep:支援使用擴充正規表達式。

fgrep:不支援使用正規表達式,即所有的正規表達式中的元字元都将作為一般字元,僅僅擁有其字面 意義,不再擁有特殊意義。

     grep指令的名稱來自于全局搜尋正規表達式并列印文本行(Global Search Regular Expression and Print out the line)的縮寫。它是一個非常古老的UNIX指令,也是一種強大的文本搜尋工具。grep指令 使用正規表達式來搜尋文本,并且把比對的文本行列印出來。

     grep指令根據使用者指定的”pattern(過濾條件)“對目标文本逐行進行比對檢查;列印出符合條件的 行,即文本搜尋工具。注:PATTERN即過濾條件指由文本字元及正規表達式元字元所編寫的字元串。

 grep指令的基本文法如下:grep [options] pattern [file…]

     在上面的文法中,options表示選項,選項清單如下表。pattern表示要比對的模式,file表示一系列的文 件名。grep指令會從一個或者多個檔案中搜尋滿足指定模式的文本行,并且列印出來。模式後面的所有的字元串參數都被看作是檔案名。

shell 正規表達式詳解正規表達式

示例:

1,  -n :    顯示行号

[[email protected] ~]# ls -l | grep -n num

21:-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

shell 正規表達式詳解正規表達式

2,  -o :    隻顯示比對的内容

[[email protected] ~]# ls -l | grep -o num

num

shell 正規表達式詳解正規表達式

3,  -q :   靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的内容

[[email protected] ~]# ls -l | grep -q num

[[email protected] ~]# echo $?

shell 正規表達式詳解正規表達式

4,  -A :   如果比對成功,則将比對行及其後n行一起列印出來

[[email protected] ~]# ls -l | grep num -A 2

-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Pictures

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Public

shell 正規表達式詳解正規表達式

5,   -B :    如果比對成功,則将比對行及其前n行一起列印出來

[[email protected] ~]# ls -l | grep num -B 2

-rw-r--r--. 1 root root    0 Jan 30 11:37 newfile

-rw-r--r--. 1 root root  171 Jan 30 21:55 newfile.sh

-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

shell 正規表達式詳解正規表達式

6,   -C :    如果比對成功,則将比對行及其前後n行一起列印出來

[[email protected] ~]# ls -l | grep num -C 2

-rw-r--r--. 1 root root    0 Jan 30 11:37 newfile

-rw-r--r--. 1 root root  171 Jan 30 21:55 newfile.sh

-rw-r--r--. 1 root root  222 Feb  1 17:53 num_script.sh

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Pictures

drwxr-xr-x. 2 root root    6 Dec 31 19:16 Public

shell 正規表達式詳解正規表達式

7,   -c :如果比對成功,則将比對到的行數列印出來 (統計行數)

[[email protected] ~]# ls -l | grep -c num

1

shell 正規表達式詳解正規表達式

--color:     高亮顔色顯示比對到的字元串

--color=never沒有顔色

--color=always

--color=auto自動的顔色

-E:  支援擴充中的表達式

-e:支援基本的正規表達式

-P: 對Perl的正規表達式的支援

8,   -o:隻輸出比對到的内容

[[email protected] ~]# ls -l | grep  function

-rw-r--r--. 1 root root  682 Feb  3 12:07 function_script.sh

[[email protected] ~]# ls -l | grep -o  function

function

shell 正規表達式詳解正規表達式

9,   -v :取反,不比對

[[email protected] ~]# ls -l | grep -v  function

total 72

-rw-r--r--. 1 root root  331 Feb  1 20:22 99table_script.sh

-rw-------. 1 root root 1272 Dec 31 19:14 anaconda-ks.cfg

-rw-r--r--. 1 root root  215 Jan 31 15:27 arg_script.sh

-rw-r--r--. 1 root root  332 Jan 31 15:28 args_script.sh

drwxr-xr-x. 2 root root   36 Jan  1 11:00 at230101

drwxr-xr-x. 2 root root  116 Jan  8 18:15 ca_learning

shell 正規表達式詳解正規表達式

10,   -w:比對單詞

[[email protected] 0202]# grep -w hello file.txt

hello

hello world

shell 正規表達式詳解正規表達式

四,基本正規表達式

        基本正規表達式(Basic Regular Expression,BRE),又稱為标準正規表達式,是最早制訂的正則表達 式規範,僅支援最基本的元字元集。基本正規表達式是POSIX規範制訂的兩種正規表達式文法标準之 一,另外一種文法标準稱為擴充正規表達式。

shell 正規表達式詳解正規表達式

基本正規表達式示例:

1,   ^ 在每行的開始進行比對

比對以123為開頭的

[[email protected] ~]# echo "123 456 789" | grep ^123

123 456 789

[[email protected] ~]# echo "123 456 789" | grep ^456

[[email protected] ~]#

shell 正規表達式詳解正規表達式

2,   $ 在每行的末尾進行比對

比對以789結尾的

[[email protected] ~]# echo "123 456 789" | grep 789$

123 456 789

[[email protected] ~]# echo "123 456 789" | grep 456$

[[email protected] ~]#

shell 正規表達式詳解正規表達式

3,     . 對任何單個字元進行比對

比對ab後面連着任意一個字元

[[email protected] 0202]# echo "abcdabef" | grep ab.

abcdabef

shell 正規表達式詳解正規表達式

比對ab後面連着任意2個字元

[[email protected] ~]# echo "abcdabcdabcd" | grep a..

abcdabcdabcd

shell 正規表達式詳解正規表達式

4,     *(量詞) 對前一項進行0次或多次重複比對

盡可能多的去比對(成功的前提下)

多次a

[[email protected] ~]# echo "aaabbbccc" | grep "a*"

Aaabbbccc

0次a

[[email protected] ~]# echo "bbbccc" | grep "a*"

bbbccc

shell 正規表達式詳解正規表達式

5,       [str] 對str中的任何單個字元進行比對

6,        [a-b] 對a到b之間的任何字元進行比對

[[email protected] ~]# echo "a" | grep [a-z]

a

[[email protected] ~]# echo "7" | grep [0-9]

7

[[email protected] ~]# echo "m" | grep [a-z]

m

shell 正規表達式詳解正規表達式

7,     [^str] 對任何不在str中的單個字元進行比對

比對,abc的補集

[[email protected] 0202]# echo "a" | grep [^abc]

[[email protected] 0202]# echo "m" | grep [^abc]

m

shell 正規表達式詳解正規表達式

8,     \ 忽略後面一個字元的特殊含義

取消.的特殊意義

[[email protected] ~]# echo "3a14" | grep "^3.14"

3a14

[[email protected] ~]# echo "3a14" | grep "^3\.14"

[[email protected] ~]#

shell 正規表達式詳解正規表達式

 注意:grep要将{}轉義,\{\},egrep不需要轉義

9,    a{n}: a重複指定的次數

[[email protected] 0202]# echo "aaaaaaaa" | grep 'a\{5\}'

aaaaaaaa

[[email protected] 0202]# echo "aaaaaaaa" | egrep 'a{5}'

aaaaaaaa

shell 正規表達式詳解正規表達式

10,   a{n,m}: 重複n-m次(貪婪的)

對a第一次比對(重複)5次,第二次比對三次

[[email protected] 0202]# echo "aaaaaaaa" | grep 'a\{2,5\}'

aaaaaaaa

shell 正規表達式詳解正規表達式

11,    a{n,}: 最少重複n次,最多沒有限制

貪婪的,重複最多次

[[email protected] 0202]# echo "aaaaa" | grep 'a\{2,\}'

aaaaa

shell 正規表達式詳解正規表達式

12,    a{,m}:最多重複m次,最少沒有限制

[[email protected] 0202]# echo "aaaaa" | grep 'a\{,2\}'

aaaaa

shell 正規表達式詳解正規表達式

13,    \(\),定義子表達式的開始和結束位置。

比對abcd

[[email protected] 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)'

abcdefbcdcdd

shell 正規表達式詳解正規表達式

比對abcdef,組1

[[email protected] 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1'

abcdefbcdcdd

shell 正規表達式詳解正規表達式

比對abcdefbcd(組1)cd(組2)

[[email protected] 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1\2'

abcdefbcdcdd

shell 正規表達式詳解正規表達式

14,    \或\b:錨定詞尾(支援vi和grep),其前面的任意字元必須作為單詞尾部出現,

隻比對單詞的首尾,不包括特殊符号,除了.   ?

[[email protected] 0202]# echo "hello" | grep '\bhello\b'

hello

[[email protected] 0202]# echo "helloo" | grep '\bhello.\b'

helloo

shell 正規表達式詳解正規表達式

貪婪:盡可能多的去比對(大前提:比對成功)

a*: 0-任意多

a?:0-1

a+:1-任意

a{n,m}: n-m

正規表達式字元集

shell 正規表達式詳解正規表達式

正規表達式字元集示例:

1,    [[:alnum:]] 比對任意一個字母或者數字,等價于[A-Za-z0-9]

[[email protected] 0202]# echo "hello123" | grep '[[:alnum:]]*'

hello123

shell 正規表達式詳解正規表達式

[[email protected] 0202]# echo "hello123" | grep '[a-zA-Z0-9]*'

hello123

shell 正規表達式詳解正規表達式

2,     [[:alpha:]] 比對任意一個字母,等價于[A-Za-z]

[[email protected] 0202]# echo "hello123" | grep '[[:alpha:]]*'

hello123

shell 正規表達式詳解正規表達式

[[email protected] 0202]# echo "hello123" | grep '[a-zA-Z]*'

hello123

shell 正規表達式詳解正規表達式

3,     [[:digit:]] 比對任意一個數字,等價于[0-9]

[[email protected] 0202]# echo "hello123" | grep '[[:digit:]]*'

hello123

shell 正規表達式詳解正規表達式

[[email protected] 0202]# echo "hello123" | grep '[0-9]]*'

hello123

shell 正規表達式詳解正規表達式

4,     [[:lower:]] 比對任意一個小寫字母,等價于[a-z]

[[email protected] 0202]# echo "Hello123" | grep '[[:lower:]]*'

Hello123

shell 正規表達式詳解正規表達式

[[email protected] 0202]# echo "Hello123" | grep '[a-z]*'

Hello123

shell 正規表達式詳解正規表達式

5,    [[:upper:]] 比對任意一個大寫字母,等價于[A-Z]

[[email protected] 0202]# echo "Hello123" | grep '[[:upper:]]*'

Hello123

shell 正規表達式詳解正規表達式

[[email protected] 0202]# echo "Hello123" | grep '[A-Z]*'

Hello123

shell 正規表達式詳解正規表達式

6,     [[:space:]] 比對任意一個空白符,包括空格、制表符、換行符以及分頁符

空格

[ro[email protected] 0202]# echo "Hello    123" | grep '[[:space:]]*'

Hello    123

shell 正規表達式詳解正規表達式

制表符(占8位)

[[email protected] 0202]# echo -e "Hello\t\t\t123" | grep '[[:space:]]*'

Hello                        123

shell 正規表達式詳解正規表達式

換行符(grep   -z 選線)

[[email protected] 0202]# echo -e "Hello\n\n123" | grep -z '[[:space:]]*'

Hello

123

shell 正規表達式詳解正規表達式

五,擴充正規表達式

       擴充正規表達式(Extended Regular Expression,ERE)支援比基本正規表達式更多的元字元,但是擴充正規表達式對有些基本正規表達式所支援的元字元并不支援。前面介紹的元字元“^”、“$”、“.”、“*”、 “[]”以及“[^]”這6個元字元在擴充正規表達式都得到了支援,并且其意義和用法都完全相同,不再重複介紹。接下來重點介紹一下在擴充正規表達式中新增加的一些元字元。

shell 正規表達式詳解正規表達式

擴充正規表達式示例:

1,+   對前一項進行1次或多次重複比對

[[email protected] 0202]# echo "sssssss" | grep  -E 's+'

sssssss

shell 正規表達式詳解正規表達式

2,     ?    對前一項進行0次或1次重複比對

[[email protected] 0202]# echo "sssssss" | grep  -E 's?'

sssssss

shell 正規表達式詳解正規表達式

3,    比對單獨的a

[[email protected] 0202]# echo "sssssss" | grep  -E 's*?'

sssssss

shell 正規表達式詳解正規表達式

非貪婪:盡可能少的去比對

a*?

a+?

a??

a{n,m}?

擴充:

1,     (?:):分組的非捕獲版本

加了?:的不參與分組

[[email protected] 0202]# echo "abcdefgbcd" | grep -Po 'a(?:b(c(d)))efg\1'
shell 正規表達式詳解正規表達式

加了?:的不參與分組,組名順延

[[email protected] 0202]# echo "abcdefgcd" | grep -Po 'a(?:b(c(d)))efg\1'

abcdefgcd

shell 正規表達式詳解正規表達式

2,         給分組命名      ?p<組名>        (?p=組名)

[[email protected] 0202]# echo "abcdefgbcd" | grep -Po 'a(?P<g1>b(c(d)))efg(?P=g1)'

abcdefgbcd

shell 正規表達式詳解正規表達式

3,     ?#注釋,裡面的内容不參與比對

[[email protected] 0202]# echo "abcdefgbcd" | grep -Po 'a(?#express)(b(c(d)))efg\1'

abcdefgbcd

shell 正規表達式詳解正規表達式

4,(?=): 不消耗樣式 lookahead assertion: 前視斷言:他是一個判定條件,但是不作為結果範圍,也不消耗内容

去比對,要擷取的是windows,但是隻能是windows10的時候擷取windows

[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)"

windows

[[email protected] 0202]# echo "windows10" | grep -Po "windows(?=10)10"

windows10

[root@wangjingjing 0202]# echo "windows98" | grep -Po "windows(?=10)"

[[email protected] 0202]#

shell 正規表達式詳解正規表達式

5,      (?!…):  negative lookahead assertion: 前視預斷言取反

去比對,要擷取的是windows,但是隻能不是windows10的時候擷取windows

[root@wangjingjing 0202]# echo "windows10" | grep -Po 'windows(?!10)'

[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)'

windows

[[email protected] 0202]# echo "windows98" | grep -Po 'windows(?!10)98'

windows98

shell 正規表達式詳解正規表達式

6,       (?<=…): positive lookbehind assertion: 後視斷言

隻有windows前邊是10的時候,才比對成功,也是傳回windows

[email protected] 0202]# echo "10windows" | grep -Po '(?<=10)windows'

windows

[[email protected] 0202]# echo "10windows" | grep -Po '10(?<=10)windows'

10windows

[[email protected] 0202]# echo "10windows" | grep -Po '98(?<=10)windows'

[[email protected] 0202]#

shell 正規表達式詳解正規表達式

7,       (?<!…): positive lookbehind assertion: 後視斷言取反

隻有windows前邊不是10的時候,才比對成功,也是傳回windows

[[email protected] 0202]# echo "10windows" | grep -Po '(?<!10)windows'

[[email protected] 0202]# echo "10windows" | grep -Po '10(?<!10)windows'

[[email protected] 0202]# echo "98windows" | grep -Po '(?<!10)windows'

windows

[[email protected] 0202]# echo "98windows" | grep -Po '98(?<!10)windows'

98windows

shell 正規表達式詳解正規表達式

8,       A|B: 比對A或者B:A和B都是正規表達式

[[email protected] 0202]# egrep "^h|o$" file.txt

hello

hi

hello world

shell 正規表達式詳解正規表達式

繼續閱讀