Shell 正則表達式
什么是正則表達式?
正則表達式在每種語言中都會有,功能就是匹配符合你預期要求的字符串。
為什么要學正則表達式?
在企業工作中,我們每天做的linux運維工作中,時刻都會面對大量帶有字符串的文本配置、程序、命令輸出及日志文件等,而我們經常會有迫切的需要,從大量的字符串內容中查找符合工作需要的特定的字符串。這就要靠正則表達式。因此,可以說正則表達式就是為過濾字符的需求而生的!
例如:ifconfig的輸出取IP,例如:cat /var/log/messages輸出等
兩個注意事項:
- 正則表達式應用非常廣泛,存在於各種語言中,例如:php、python、java等。但是我們今天講的linux系統運維工作中的正則表達式,即linux正則表達式,最常用正則表達式的命令就是grep(egrep)、sed、awk,換句話說linux四劍客劍客要想工作的各高效,那一定離不開正則表達式配合的。
- 正則表達式和我們常用的通配符特殊字符是用本質去別的,這一點要注意。通配符例子:ls .log**這里的就是通配符(表示所有),不是正則表達式
Shell 正則表達式分為兩種:
- 基礎正則表達式:BRE(basic regular express)
- 擴展正則表達式:ERE(extend regular express),擴展的表達式有+、?、|和()
下面是一些常用的正則表達式符號
| 正則表達式 | 描述 |
|---|---|
| \ | 轉義符,將特殊字符進行轉義,忽略其特殊意義 |
| ^ | 匹配行首,awk中,^則是匹配字符串的開始 |
| $ | 匹配行尾,awk中,$則是匹配字符串的結尾 |
| . | 匹配除換行符\n之外的任意單個字符,awk則中可以 |
| [] | 匹配包含在[字符]之中的任意一個字符 |
| [^ ] | 匹配[^字符]之外的任意一個字符 |
| [1] | 匹配不是中括號內任意一個字符開頭的行 |
| [ - ] | 匹配[]中指定范圍內的任意一個字符,要寫成遞增 |
| ? | 匹配之前的項1次或者0次 |
| + | 匹配之前的項1次或者多次 |
| * | 匹配之前的項0次或者多次 |
| () | 匹配表達式,創建一個用於匹配的子串 |
| { n } | 匹配之前的項n次,n是可以為0的正整數 |
| {n,} | 之前的項至少需要匹配n次 |
| {n,m} | 指定之前的項至少匹配n次,最多匹配m次,n<=m |
| | | 交替匹配|兩邊的任意一項 |
| < | 邊界符,匹配字符串開始 |
| > | 邊界符,匹配字符串結束 |
基本正則表達式實踐
接下來的測試文本如下:
[root@localhost ~]# cat test.log
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges –notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges –emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end...
=========================
以下實踐通過grep 命令增加正則表達式進行匹配練習
^(尖角號)功能實踐
# 匹配首字母為%的行
[root@localhost ~]# grep -n "^%" test.log
# -n 參數是顯示匹配到的行號。

$(美元符)功能實踐
#匹配結尾字符為y的所在行
[root@localhost ~]# grep -n "y$" test.log

^$功能實踐
#匹配所有的空行進行顯示
[root@localhost ~]# grep -n "^$" test.log

(點)功能實踐
#匹配任意單個字符進行顯示(排除空行)
[root@localhost ~]# grep -n "." test.log

\(轉義符)功能實踐
#將特殊字符進行轉義,忽略其特殊意義

*(星號)功能實踐
#匹配任意的項0次或者多次

.*組合符功能實踐
.* 組合在一起使用可以匹配任意字符串

#匹配任意以o開頭的行

[](中括號)功能實踐
#匹配到任意包含a-z 字母的字符

[^abc](中括號內取反符)功能實踐
#匹配取反字符,將^放在括號內代表取反的意思

擴展正則表達式實踐
+(加號)功能實踐
#匹配之前+號之前的字符1次或者多次

?(問號)功能實踐
#匹配之前?號之前的字符1次或者0次

|(豎線)功能實踐
#豎線匹配可以進行多個值的選定

() 功能實踐
要求:取出包含good或glad的行

#后向引用,后項引用主要用作於匹配分組調換順序的時候進行使用,\1 表示調用前面第一個括號里面的內容,\2 代表調用第2個括號里面的內容,最多能引用九個括號,也就是說支持從 \1 - \9。

{n,m}匹配次數功能實踐
#單獨使用一個大括號,可以引用前面的字符一次到多次

\< \>邊界符錨定
#邊界符可以用固定字符的匹配
\<:其后面的字符必須作為單詞的首部出現
\>:其前的字符必須作為單詞的尾部出現
\<root\<:root必須作為一行的單詞出現

在Shell下使用這些正則表達式處理文本最多的命令有下面幾個工具:
| 命令 | 描述 |
|---|---|
| grep | 默認不支持擴展表達式,加-E選項開啟ERE。如果不加-E使用花括號要加轉義符{} |
| egrep | 支持基礎和擴展表達式 |
| awk | 支持egrep所有的正則表達式 |
| sed | 默認不支持擴展表達式,加-r選項開啟ERE。如果不加-r使用花括號要加轉義符{} |
^ ↩︎
