Shell 正則表達式詳解


Shell 正則表達式

什么是正則表達式?

正則表達式在每種語言中都會有,功能就是匹配符合你預期要求的字符串。

為什么要學正則表達式?

在企業工作中,我們每天做的linux運維工作中,時刻都會面對大量帶有字符串的文本配置、程序、命令輸出及日志文件等,而我們經常會有迫切的需要,從大量的字符串內容中查找符合工作需要的特定的字符串。這就要靠正則表達式。因此,可以說正則表達式就是為過濾字符的需求而生的!
例如:ifconfig的輸出取IP,例如:cat /var/log/messages輸出等

兩個注意事項:

  1. 正則表達式應用非常廣泛,存在於各種語言中,例如:php、python、java等。但是我們今天講的linux系統運維工作中的正則表達式,即linux正則表達式,最常用正則表達式的命令就是grep(egrep)、sed、awk,換句話說linux四劍客劍客要想工作的各高效,那一定離不開正則表達式配合的。
  2. 正則表達式和我們常用的通配符特殊字符是用本質去別的,這一點要注意。通配符例子: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 命令增加正則表達式進行匹配練習

  1. ^(尖角號)功能實踐
# 匹配首字母為%的行
[root@localhost ~]#  grep -n "^%" test.log 
# -n 參數是顯示匹配到的行號。

1570716106386

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

1570716156583

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


1570716182783

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

1570716218056

  1. \(轉義符)功能實踐

#將特殊字符進行轉義,忽略其特殊意義

1570716237463

  1. *(星號)功能實踐

#匹配任意的項0次或者多次

1570716255958

  1. .*組合符功能實踐

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

1570716277103

#匹配任意以o開頭的行

1570716339064

  1. [](中括號)功能實踐

#匹配到任意包含a-z 字母的字符

1570716370155

  1. [^abc](中括號內取反符)功能實踐

#匹配取反字符,將^放在括號內代表取反的意思

1570716393582

擴展正則表達式實踐

  1. +(加號)功能實踐

#匹配之前+號之前的字符1次或者多次

1570782299517

  1. ?(問號)功能實踐

#匹配之前?號之前的字符1次或者0次

1570782308374

  1. |(豎線)功能實踐

#豎線匹配可以進行多個值的選定

1570782322885

  1. () 功能實踐

要求:取出包含good或glad的行

1570782405525

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

1570782420917

  1. {n,m}匹配次數功能實踐

#單獨使用一個大括號,可以引用前面的字符一次到多次

1570782435217

  1. \< \>邊界符錨定

#邊界符可以用固定字符的匹配

\<:其后面的字符必須作為單詞的首部出現

\>:其前的字符必須作為單詞的尾部出現

\<root\<:root必須作為一行的單詞出現

1570782493490

在Shell下使用這些正則表達式處理文本最多的命令有下面幾個工具:

命令 描述
grep 默認不支持擴展表達式,加-E選項開啟ERE。如果不加-E使用花括號要加轉義符{}
egrep 支持基礎和擴展表達式
awk 支持egrep所有的正則表達式
sed 默認不支持擴展表達式,加-r選項開啟ERE。如果不加-r使用花括號要加轉義符{}

  1. ^ ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM