Linux正則表達式

正則表達式

1、什麼是正則表達式

1.1、正則表達式就是爲了處理大量的文件文本字符串而定義的一套規則和方法

1.2、通過定義的這些特殊符號的輔助,系統管理員就可以快速過濾,替換或輸出需要的字符串

1.3Linux正則表達式一般以行爲單位處理

簡單說:

  • 正則表達式就是爲了處理大量的文本文件,字符串而定義的一套規則和方法

  • 以行爲單位,一次處理一行

2、爲何使用正則表達式:

  • Linux運維工作,大量過濾日誌工作   化繁爲簡

  • 簡單,高效,易用

  • 正則表達式高級工具    Linux三劍客都支持

注意:

正則表達式用來找:文件內容   文本  字符串   三劍客都支持

通配符用來找文件名,文件      普通命令都支持

3BREERE的區別僅僅是元字符的不同:

  • BRE(基礎正則表達式)只承認的元字符有 ^ $  .  [ ]  *其它字符識別爲普通字符。

  • ERE(擴展正則表達式)則添加了()  {}  +  |

  • 只有在用反斜槓“\”進行轉義的情況下,字符()  { }  纔會在BRE被當做元字符處理,而在ERE中,任何元字符號前面加上反斜槓反而會使其被當做普通字符來處理

4、基礎正則表達式(BRE

符號

描述

^ 尖角號

查找以什麼開頭的文件

例子:

grep "^r" text.txt
 
root:x:0:0:root:/root:/bin/bash

表示以r開頭行

$

查找以什麼結尾的文件

例子:

grep "h$" text.txt
 
root:x:0:0:root:/root:/bin/bash

表示以h結尾

^$

取空行

例子:

grep "^$" text.txt     text.txt的空行

text.txt文件中的空行

\

轉義符,用來屏蔽一個特殊字符的特殊含義  失去了一個字符的本身含義

例子:

grep "\!$" text.txt

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin!

取以!號結尾的行,不加轉義符不行而不是取反

\n   匹配一個換行符

\r   匹配回車

\t   匹配一個橫向製表符  tab

[abc]

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

[abc]表示取中括號內的a或者b或者c,而不是abc整體

例子:

grep "[1-3]" text.txt
 234
 531
 342342

查找包含1-3的行

[^1-3]

不包含^後的任意字符,123。表示取反

例子:

[root@oldboyedu]# grep '[^a-z]' file.txt  
 
iamisoldboyoldgirlnginxlinux OLDBOY
 
234543
 
34r3       找出不包含a-z的行,黑色爲過濾掉的

.

“.”匹配且只能匹配任意一個字符(不匹配空行

例子:

grep "5.1" text.txt

531

表示匹配51中間任意一個字符

grep "23." text.txt

234

342342

匹配23後面任意一個字符

[root@oldboyedu]# grep "." file1.txt

fgsdgsdfdsmldsmgdls,,,,;sdkgsdwww.qq.comgel

ewgmewlgmewgwelgewww.qq.com

gsgewgewgeomomodsgmegipweigtepvsnvdvd  

dfjwwewww.qq.com

rewrwero39r309,.;l'121'l'..www.qq.com

erjeowew.emglwewetwewww.qq.com

35325325230www.qq.com

“.”匹配任意一個字符,所以匹配到了全部並且打印出來了,

*

匹配0次或多次      重複前一個字符0多次的字符

重複、連續0的時候,表示什麼也沒有(空),匹配出文件所有內容

例如:

grep "333*" text.txt

2333333445565

5666633

注意:*號與不加*號的區別

例子:加*

[root@oldboyedu ]#  grep -o "3*" text.txt

3

333333

333

3333

33

注意:*號表示連續匹配前一個字符0次到多次,*號有個貪婪性,它會儘可能多的匹配

例子:不加*

[root@oldboyedu]#  grep -o "3" text.txt

3

3

3

3

3

3

3

3

3

注意:不加*號表示只能一個一個的匹配,不會連續的匹配

正則符號的貪婪性

正則中的*號和+號會有個貪婪性,它們會儘可能多的來匹配文件中的內容,匹配的越多越好,直到沒有匹配的內容爲止

例子:

[root@oldboyedu]# grep -o  "3*" text.txt

3

3

3

3

3

333333

333

3333

33

[root@oldboyedu]# egrep -o  "3+" text.txt  +號屬於擴展正則中的符號

3

3

3

3

3

333333

333

3333

33

+匹配前一個連續的字符1次到多次

基礎正則的命令(grep)如何支持高級正則(擴展正則)

a\{m,n\}

重複前面一個字符mn次,如果用egrepsed –r可去掉斜線

重複前面一個字符m次到n

例子:

grep "6\{1,2\}"  /oldboy/text.txt
 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown!
 
23333..33,445565
 
5666.6,33         匹配6一次或兩次,最多兩次

例子2

egrep --color=auto  "3{1,3}" /oldboy/text.txt

23333..33,445565
 
5666.6,33         匹配3一次或三次,最多三次

例子:

[root@oldboyedu]#  egrep --color=auto -o "3{1,3}" /oldboy/text.txt

3

3

3

3

3

333

333

333

333

匹配3最少1次,最多三次

a\{m,\}

重複前面字符至少m次,如果用egrepsed r可去掉斜線

例子:

[root@oldboyedu]# grep  "6\{2,\}" text.txt

5666.6,33

匹配數字6至少兩次

a\{m\}

重複前面字符m次,如果用egrepsed r可去掉斜線

例子:

[root@oldboyedu]# egrep --color=auto  "6{3}" text.txt

5666.6,33

只匹配數字6三次

a\{,m\}

重複前面的字符最多m次,如果用egrepsed r可去掉斜線

例子:

[root@oldboyedu]# grep  "6\{,3\}" text.txt

23333..33,445565

5666.6,33

匹配數字6最多3

4.1實例:

查找text.txt文件中以u開頭到l的匹配行

解答:

[root@oldboyedu]# grep "^u.*l"text.txt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

5、擴展正則表達式(ERE

符號

描述

+

匹配1次或多次連續的字符

例子:

egrep -o "[a-z]+" text.txt

root

x

root

root

bin

bash

bin

取出text.txt文件中所有的單詞

例子:

[root@oldboyedu]# egrep -o  "6+" text.txt

6

6

6666

|

或者,同時過濾多個字符

例子:

egrep "is|am" my.txt
 
I am oldboy,myqq is 31333741
 
egrep -o "is|am" my.txt
 
am
 
is

[root@oldboyedu]# egrep -o "am|is" my.txt

am

is

-o只顯示匹配到的內容
 
egrep "1521|3306" /etc/services
 
mysql            3306/tcp                 # MySQL
 
mysql            3306/udp                 # MySQL
 
ncube-lm         1521/tcp                # nCube  License Manager
 
ncube-lm         1521/udp                # nCube  License Manager

例子:

[root@oldboyedu]# dumpe2fs  /dev/sda3|egrep -i "inode  size|block size"

dumpe2fs 1.41.12 (17-May-2010)

Block size:           4096

Inode size:           256

例子:

[root@oldboyedu]# dumpe2fs  /dev/sda3|egrep -i "inode  count|^block count"

dumpe2fs 1.41.12 (17-May-2010)

Inode count:              462384

Block count:              1849088

()

小括號的中的內容爲一個整體

例如:

[root@oldboyedu]# egrep  "oldb(o|e)y" oldboy.sh

oldboy

oldbey

?

重複前一個字符出現01

6、標識字符集,有如下幾種:

[::alnum] : 數字字符

[:digit:] : 數字字符

[:punct:] : 標點符號字符

[:alpha:] : 字母字符

[:graph:] : 非空格字符

 [:space:] : 空格字符

[:blank:] : 空格與定位字符

[:lower:] : 小寫字母字符

[:upper:] : 大寫字母字符

[:cntrl:] : 控制字符

[:print:] : 可顯示的字符

[:xdigit:] : 16進制數字


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章