linux正則表達式


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)或者,當前一個指令執行失敗時,執行后一個指令
 ..  兩個點代表上一級目錄
 .  點代表當前目錄


免責聲明!

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



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