linux正則表達式
1、什么是正則表達式?
簡單的說,正則表達式就是為處理大量的字符串而定義的一套規則和方法。
例如:假設“@”代表syz1,“!”代表syz2,echo"@!"===“syz1syz2”
通過定義的這些特殊符號的輔助,系統管理員就可以快速過濾,替換或輸出需要的字符串。
linux正則表達式一般以“行”為單位處理的。
2、為什么要學會正則表達式?
在企業工作中,我們每天做的linux運維工作中,時刻都會面對大量帶有字符串的文本配置、程序、命令輸出及日志文件等,而我們經常會有迫切的需要,從大量的字符串內容中查找符合工作需要的特定的字符串,這就是正則表達式,因此可以說正則表達式就是為了過濾這樣的字符串的需求而生的。
3、容易混淆的兩個注意事項:
a、正則表達式應用非常廣泛,存在於各種語言中,例如:php,Python、Java等,但是,我們講的是linux系統運維工作中的正則表達式,即linux正則表達式,最常應用正則表達式的命令就是grep(egrep),sed,awk,換句話說linux三劍客要想能工作的更高效,那一定離不開正則表達式配合的。
b、正則表達式和我們常用的通配符特殊字符是有本質區別的,這一點伙伴們要注意。通配符例子:ls *.log 這里的*就是通配符(表示所有),不是正則表達式。
一:基礎正則
表達式 | 含義 |
^ | ^word表示匹配以word開頭的內容(打印的是一行內容),vi/vim 編輯器里^代表一行的開頭 |
$ | word$表示匹配word結尾的內容(打印的是一行內容),vi/vim編輯器里$代表一行的結尾 |
^$ | 表示空行 |
. | 代表且只能代表任意一個字符 |
\ | \.就只代表點本身,轉義符號,讓有着特殊身份意義的字符,脫掉馬甲,還原原形 |
* | 重復0個或多個前面一個字符,例如:0*,有1個0或多個000000 |
.* | 匹配所有字符,延伸^.*以任意多個字符開頭,.*$以任意多個字符結尾 |
[abc] | 匹配字符集合內的任意一個字符[a-zA-Z],[0-9](單個字符而不是包含的單詞) |
[^abc] | 匹配不包含^后的任意一個字符的內容(單個字符而不是包含的單詞);其中括號里^為取反,注意和中括號內以^開頭區別 |
a\{n,m\} | 重復n到m次,前一個重復的字符,如果用egrep/sed -r可以去掉斜線; 例子:gerp "0\{3,4\}" syz.log 意思為,0匹配,3-4次 my qq name is 49000448 not 490000048 |
a\{n,\} | 重復至少n次,前一個重復的字符,如果用egrep/sed -r 可以去到斜線 |
a\{n\} | 重復n次,前一個重復的字符,如果用egrep/sed -r 可以去掉斜線 例子:gerp "0\{3\}" syz.log 意思為,0匹配,3次 my qq name is 49000448 |
a\{,m\} | ????Centos5不能用,Centos6、7可以用 例子:gerp "0\{3\}" syz.log 意思為,0匹配,3次 my qq name is 49000448 |
注意:
egrep(grep -E)或sed -r 過濾一般特殊字符可以不轉義(即不用\)。
例如egrep(grep -E) "0{3}" syz.log
點(.)的含義小結:
1、當前目錄
2、使得文件生效相當於source
3、隱藏文件
4、任意一個字符(grep正則)
擴展的正則表達式:
1、+ 表示重復“一個或一個以上”前面的字符(*是0或多個)
例子:[root@syz ~]# cat syz.txt
my god ,i am syz
gd
good
[root@syz ~]# egrep "g+d" syz.txt
gd
[root@syz ~]# egrep "go+d" syz.txt
my god ,i am oldboy
good
[root@syz ~]# egrep "go*d" syz.txt
my god ,i am syz
gd
good
2、? 表示重復“0個或一個”前面的字符(.是有且只有一個)
例子:
[root@syz ~]# cat syz.txt
my god ,i am syz
gd
good
goood
[root@syz ~]# egrep "go?d" syz.txt
my god ,i am syz
gd
[root@syz ~]# egrep "go.d" syz.txt
good
3、| 表示同時過濾多個字符串
例子:
[root@syz ~]# egrep "god|good" syz.txt
my god ,i am syz
good
4、() 分組過濾(少用),后向引用(主用)
例子:
[root@syz ~]# egrep "g(la|oo)d" syz.txt
good
glad
元字符:
\b 單詞邊界
例子:
[root@syz ~]# grep "syz" syz.txt
my god ,i am syz
syz1
[root@syz ~]# grep "\bsyz\b" syz.txt
my god ,i am syz
通配符
通配符一般用戶命令行bash環境,而linux正則表達式用於grep/sed/awk場景;
linux通配符和三劍客(grep/awk/sed)正則表達式是不一樣的,因此,代表的意義也是有較大區別的。
通配符 | 含義 |
* | 通配符,代表所有(0到多個)字符 |
? | 通配符,代表任意1個字符 例子:ls ????.txt 會匹配4個字符如test.txt ls ?.txt 會匹配1個字符如t.txt |
; | 連續不同命令的分隔符(兩個命令的分隔符) |
# | 配置文件注釋(就是讓其命令失效,但可以給管理員看到) |
| | 管道 |
~ | 當前用戶的家目錄 |
- | 上一次所在的目錄(路徑) |
$ | 變量前需要加的符號 例子:[root@syz test]# echo $LANG en_US.UTF-8 |
/ | 路徑分隔符號,也是根的意思 |
>或1> | 重定向,覆蓋原有數據 |
>> | 追加重定向,追加內容文件尾部 |
< | 輸入重定向(xargs,tr) |
<< | 追加輸入重定向 |
' | 單引號,不具有變量置換功能,輸出時所見即所得 例子:[root@syz test]# echo 'date' date |
" | 雙引號,具有變量置換功能,解析變量后輸出,不加引號相當於雙引號,常用雙引號 例子:[root@syz test]# echo "`date`" Fri Jul 20 20:11:49 CST 2018 [root@syz test]# echo "$(date)" Fri Jul 20 20:12:44 CST 2018 |
` | tab鍵上面的鍵,反引號,兩個``中間為命令,會先執行,等價於$() |
{} | 中間為命令區塊組合或內容序列 例子:[root@syz test]# echo syz{1,2,3} syz1 syz2 syz3 |
! | 邏輯運算中的“非”(not) |
&& | (and)並且,兩邊條件同時滿足,當前一個指令執行成功時,執行后一個指令 |
|| | (or)或者,當前一個指令執行失敗時,執行后一個指令 |
.. | 兩個點代表上一級目錄 |
. | 點代表當前目錄 |