正則表達式 Regular expression
作者: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] 找出包含a或b或c的行
[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:以m或n或o開頭的行
[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-z、A-Z、0-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-z和A-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] 找出不包含a或b或c的行,排除的意思
[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:找出文件中不是以m或n開頭的行
方法一:[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:查找出oldboy或oldbey
[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