正則表達式和元字符
1.1 正則表達式的基本格式
regular expressiongit
做用:正則表達式
經過對文件中的內容進行過濾篩選,而後對文件的內容進行處理express
常常用基於正則寫腳原本處理日誌文件vim
構成:bash
一堆特殊符號和字母構成--元字符spa
1.2 正則表達式的種類
基本正則表達式日誌
擴展正則表達式內存
1.3 正則表達式的使用
一般會結合三個命令使用it
grep; sed; awkio
grep命令
做用:對文件中的內容進行逐行過濾
格式:grep [選項] 匹配內容 文件
選項:
-v:取反
-o:僅僅顯示出所匹配到的內容
--color:將匹配到的內容着色
-E:使用擴展正則表達式
-i: 忽略大小寫
例子:從文件a.txt中過濾出包含root的行
# grep root a.txt
例子:從文件a.txt中過濾出不包含root的行
# grep -v root a.txt
例子:從文件a.txt中找出所有的root(只顯示root)
# grep -o root a.txt
例子:從文件a.txt中統計root的個數
# grep -o root a.txt | wc -l
補充:
環境變量配置文件 ~/.bashrc
實現設置永久別名
vim ~/.bashrc
添加
alias grep="grep --color"
注意:
此時,不會馬上生效(須要讓系統從新取得配置文件到內存纔會生效)
讓系統重讀配置文件的方法
1:重啓系統
2:重啓服務
3:手動加載配置文件
手動加載配置文件
格式:source fileName
例子:讓系統讀取環境變量寫配置文件
# source ~/.bashrc
通配符和正則的區別
1. 通配符是對文件命進行匹配的;正則表達式是對文件的內容進行匹配的
2. 正則表達式是要結合grep、sed、awk使用的
1.4 正則中的元字符
1、匹配單個字符
1). 表示任意一個字符(能夠是空格,逗號, 字母, 數字..)
2)[ ] 表示範圍內的一個字符
用字母和數字的方式表示
[12345] 表示1 或2 或3 或4 或5
[1234567890] 表示 任意一個數字
[abc] 表示a 或b 或c
[a-z] 表示任意一個小寫字母
[A-Z] 表示任意一個大寫字母
[a-zA-Z] 表示任意字母
[0-9a-zA-Z] 表示全部數字和字母的任一個
例子:過濾出包含數字的行
grep [0-9] a.txt
用字符集的方式表示
[:space:] 表示一個空格
[:digit:] 表示0-9所有十個數字
等價於 0123456789, 而不等價於[0123456789]
[[:digit:]] 表示任意一個數字
[:lower:] 表示所有26個小寫字母
[:lower:] 等價於 abcdef....z
[[:lower:]] 表示任意一個小寫字母
[[:upper:]] 表示任意一個大寫字母
[[:alpha:]] 表示任意一個字母
[[:punct:]] 表示任意一個標點符號
[[:alnum:]] 表示任意一個數字和字母
補充
[[:digit:][:lower:]]
[0123456789abcdefg.......z]
例子:
匹配空格或者數字或大寫字母
[[:space:][:digit:][:upper:]]
3)[^]
匹配範圍之外的單個字符
例子:匹配沒有數字1或者3 或7的行
[^137]
例子:過濾出沒有數字的行
[^[:digit:]]
例子:過濾出沒有數字和大寫字母的行
[^[:digit:][:upper:]]
4)顯示匹配到的行的先後若干行
-A n 顯示匹配行後的N行
-B n 顯示匹配行前的N行
-C n 顯示匹配行先後的各N行
例子:從a.txt中過濾出包含數字2的行,同時顯示該行下的3行內容
# grep -A3 "2" a.txt
5)次數匹配
* 表示其前面的字符出現任意次數的狀況(0,1,n)
.* 表示任意長度的任意字符
? 表示其前面的字符出現最多一次的狀況
\{m,n\} 表示其前面的字符出現最少m次,最多n次的狀況
\{3,\} 其前面的字符出現表最少3次
\{,5\} 其前面的字符出現表最多5次
例子:
a* 表示任意多個a(但是0 ,1, n)
ab* 表示a後面的b出現任意屢次
例子:過濾出包含字母a和b的行,要求a在前,b在後
# grep "a.*b" fileName
例子:
"a\{2,5\}b"
6)位置錨定
^ 表示以什麼爲開頭的行
$ 表示以什麼爲結尾的行
\< 表示單詞首部
\> 表示單詞尾部
^$ 表示空白行
例子:
過濾出包含root的行
# grep "root" a.txt
過濾出以root爲開頭的行
# grep "^root" a.txt
過濾出以root爲結尾的行
# grep "root$" a.txt
過濾出以空格爲開頭的行
# grep "^[[:space:]]" a.txt
過濾出以多個空格後面是root爲開頭的
# grep "^[[:space:]]\{1,\}root" a.txt
7)分組
\( \) 將一個內容當作一個總體看待
\1 表示引用前面的第一個分組
\2 表示引用前面的第二個分組
例子: 從文件a.txt中,過濾出出現過兩個相同數字的行
# grep "\([[:digit:]]\).*\1" c.txt
1.5 擴展正則表達式
基本正則:grep [選項] 匹配內容 文件
擴展正則:
方式1:grep -E 匹配內容 文件
方式2:egrep 匹配內容 文件
主要多了兩個元自符:
1.次數匹配
+:其前面的字符出現至少一次的狀況效果等同於:{1,}
例子:匹配a前有至少一個b的行
[root@localhost tmp]# egrep "b+a" a.txt
或者
[root@localhost tmp]# grep -E "b+a" a.txt
2.或
|
例子:從文件a.txt中過濾出cat 和Cat
# grep -E "(c|C)at" a.txt
或者
# grep -E "cat|Cat" a.txt
補充:
在基本正則表達式中,? {} () 須要在前面使用 \ 進行轉義
在擴展正則表達式中是不須要的