1. 程式人生 > >正則表達式 Regular expression

正則表達式 Regular expression

linux 正則


作者:Georgekai

歸檔:學習筆記

2017/12/26

上章補充:

1. lsof list open file 顯示被打開的文件

例: lsof | grep delete 找出進程調用不為0的程序

2. stat 顯示文件的狀態信息

3. du 統計目錄的小大

-sh 帶單位顯示,統計目錄總大小

du -sh /*

第1章 本章正題:正則表達式

1.1 正則表達式註意事項:

1. 正則表達式按照為單位處理

2. 正則神坑---一定要註意中文符號

3. grep / egrep 過濾出來的內容加上別名,將下面的命令寫入/etc/bashrc尾部, source /etc/bashrc

生效。

alias grep='grep --color=auto'

alias egrep='egrep --color=auto'

1.2 基礎正則

1.2.1 常用符號:^ $ ^$ . * .* [] [^]

1. ^ 以什麽什麽開頭的行

例:[root@georgekai oldboy]# grep '^m' oldboy.txt

my blog is http://oldboy.blog.51cto.com

my qq is 49000448

my god ,i am not oldbey,but OLDBOY!

2. $ 以什麽什麽結尾的行

[root@georgekai oldboy]# grep 'm$' oldboy.txt

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

註:1. 註意後面的空格,可以用cat -A oldboy.txt 會在每一行的後面加上$標記。

也可以用grep ' ' oldboy.txt ,然後用光標全選,就可以看的出後面的空格。

2. cat -A 在每一行尾部加上$符號,一般用於排除空格結尾


3. ^$ 顯示文件中的空行,這一行什麽符號都沒有,空格也算一個行號

[root@georgekai oldboy]# grep -n '^$' oldboy.txt

3:

8:

註:1. -n 顯示行號

2. -v 排除 如 grep -v '^$' 表示排除空行

3. 空格也是一個符號

4. . 顯示文件中任意“一個”字符,包含空格

[root@georgekai oldboy]# grep -o '.' oldboy.txt

I

a

m

註:-o 顯示grep命令每一次找到了什麽顯示什麽,相當於執行過程

每次找到的一個條件,都會用一行來顯示,包括空格

5. * 表示前一個字符連續出現0次或0次以上

[root@georgekai oldboy]# grep '0*' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

註:1. 連續出現0次,表示沒有出現,整個文本都會顯示出來

6. .* 表示任意、所有,包含空行 (貪婪性)

[root@georgekai oldboy]# grep '^.*o' oldboy.txt

I am oldboy teacher!

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

註:1. .* 所有符號,連續出現的字符,有多少匹配多少

2. 正則中,所有符號 或 連續出現 會表現出貪婪性

7. 找出文件中以m開頭並且以m結尾的行

[root@georgekai oldboy]# grep '^m.*m$' oldboy.txt

my blog is http://oldboy.blog.51cto.com

註:註意尾部如果有空格,也是找不出來的

小結:.*

1.所以符號 任何東西

2.貪婪性

3.並且

8. 找出文件中以 . 結尾的行

[root@georgekai oldboy]# grep '\.$' oldboy.txt

I teach linux.

not 4900000448.

註: 1. 表示任何一個字符,所以需要撬棍來使它成為普通字符

2. \ 撬棍表示轉義


10. [ ] [abc] 找出包含abc的行

[root@georgekai oldboy]# grep '[abc]' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my god ,i am not oldbey,but OLDBOY!

註:1. [abc]中括號每次匹配一個符號,可以用-o查看

2. []裏面的字符沒有特殊含義,就是一個普通字符

1:以mno開頭的行

[root@georgekai oldboy]# grep '^[mno]' oldboy.txt

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

2:找出帶有a-zA-Z0-9的字符的行

[root@georgekai oldboy]# grep '[a-zA-Z0-9]' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY

3:找出文件中以小寫字母開頭並且以.!結尾的行

[root@georgekai oldboy]# grep '^[a-z].*[.!]$' oldboy.txt

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

4:找出文件中包含a-zA-Z的行

[root@georgekai oldboy]# grep '[a-Z]' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

11. [^] [^abc] 找出不包含abc的行,排除的意思

[root@georgekai oldboy]# grep '[^abc]' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

註:1. [^] 中括號裏面帶 ^ 表示排除 ^ 後面的每一個字符

2. ^ 號在中括號中只有放在第一位才表示排除

1:找出文件中不是以mn開頭的行

方法一:[root@georgekai oldboy]# grep '^[^mn]' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

our size is http://blog.oldboyedu.com

方法二:[root@georgekai oldboy]# grep -v '^[mn]' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

our size is http://blog.oldboyedu.com

1.3 . tr 替換 (不能改變文件內容)

1:將文件中回車替換成空格

[root@georgekai oldboy]# tr '\n' ' ' < oldboy.txt

I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY! [root@georgekai oldboy]#

註: 1. tr 是一對一的替換,tr 要配合 < 使用(指定從那個文件中替換)

2. sed 的閹割版

3. tr 改不了文件內容

2將小寫字母全部替換成大寫字母

[root@georgekai oldboy]# tr 'a-z' 'A-Z' <oldboy.txt

I AM OLDBOY TEACHER!

I TEACH LINUX.

I LIKE BADMINTON BALL ,BILLIARD BALL AND CHINESE CHESS!

MY BLOG IS HTTP://OLDBOY.BLOG.51CTO.COM

OUR SIZE IS HTTP://BLOG.OLDBOYEDU.COM

MY QQ IS 49000448

NOT 4900000448.

MY GOD ,I AM NOT OLDBEY,BUT OLDBOY!

註:1. tr 一對一的替換 ,a 替換成了A b替換B


小結正則--BRE

1. ^

2. $

3. ^$

4. .

5. *

6. .*

7. [ ] [a-z] [A-Z] [0-9]

1.4 擴展正則--ERE

1.4.1 常用符號:+ | ( )

1. + 前一個字符連續出現1次或1次以上

[root@georgekai oldboy]# egrep '0+' oldboy.txt

my qq is 49000448

not 4900000448.

:1. 連續出現,註意它的貪婪性

2. + [ ] 一起配合使用

1:取出文件中連續出現的小寫字母的

[root@georgekai oldboy]# egrep '[a-z]+' oldboy.txt

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

2. | 或者,取出一個字符串或者另一個字符串

[root@georgekai oldboy]# egrep '3306|1521' /etc/services

mysql 3306/tcp # MySQL

mysql 3306/udp # MySQL

ncube-lm 1521/tcp # nCube License Manager

ncube-lm 1521/udp # nCube License Manager

3. ( ) 表示一個整體,反向引用/後向引用,一般在sed中用

1:查找出oldboyoldbey

[root@georgekai oldboy]# egrep 'oldb(o|e)y' oldboy.txt

I am oldboy teacher!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my god ,i am not oldbey,but OLDBOY!

2:在123456中取出34

[root@georgekai oldboy]# echo 123456 | sed -r 's#(34)#<\1>#g'

12<34>56

: 1. <\1> 表示第1個小括號的內容, <\2> 表示第二個

2. - r sed的擴展正則用法

3:在georgekai中取出kai

[root@georgekai oldboy]# echo georgekai | sed -r 's#(......)(...)#<\2>#g'

<kai>

註:1 一個 . (點)表示一個前面的一個字符




關註微信公眾號:linux運維菜鳥之旅


正則表達式 Regular expression