SHELL訓練營--day4--正則1
阿新 • • 發佈:2018-12-21
正則及正則的意義
有這樣一個文字檔案,我們需要從裡面查詢 資訊時,需要怎麼處理呢?
一行行看麼,有計算機,可以讓計算機幫助我們查詢。
計算機如何查詢?如何匹配?這裡就涉及到匹配規則,這種規則 ,我們可以稱之為正規。
正則表示式(Regular Expression)是一種匹配模式,描述的是一串文字的特徵。
在linux中,我們可以用 grep/awk/sed 呼叫正則表示式,來查詢相關資訊。
一般情況下,是對行進行查詢匹配並進行處理的。
為什麼 這樣?如果直接對檔案進行處理,我們考慮這樣的情況 ,檔案小時,可以直接載入到記憶體。那麼當檔案 有幾百M,幾個G等,很大時,能直接放入麼?如果對檔案 進行修改,怎麼增刪改?所以將檔案分為更小的部分,以行為單位。便於處理輸出。
grep 命令
> global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來. > grep 主要是用來搜尋檔案資訊。 > 語法大致是這樣: 【grep 引數 ‘匹配字元’ 匹配檔案】。grep 'root' /etc/passwd > 引數說明: > “-c”: count 統計匹配的行數。 > "-i" : 匹配條件忽略字元的大小寫。 > "-n”: 列印匹配資訊時,輸出所在行號。 > “-v”: 取反的意思,打印出不合規則的行。 > “-A","-B","-C":列印匹配資訊相鄰的行。A=after,B=before,C=centre. > "-q": 邏輯判斷的意思,常和if 一起使用。如:`if grep -q hello a.txt ; then echo yes;else echo no; fi ` > "-r": 遞迴查詢,查詢 **目錄** 下檔案是否有匹配到資訊。如:`grep -r "root" /etc/`
- linux下文字行的相關資訊
儲存的是以”\n“為行結尾。在做匹配資訊時,以"^"表示行的開始,以”$“表示行結束。
如 匹配以 # 開頭時,可以這樣寫匹配資訊:"^#"。
匹配以"good."結束時,這樣寫:”good.$“
表示空行時,”^$“。
這裡涉及到行中有”^“或是”$“時,寫法。[[email protected] ~]# cat 1.txt good. nice. good hello good.$helo [[email protected] ~]# grep -n "good.$" 1.txt 1:good. [[email protected]
- 字串匹配
grep -n "root" /etc/passwd grep -vn "nologin" /etc/passwd grep -n '^\(root|bin\)' /etc/passwd
- 字元匹配
grep [0-9] /etc/passwd grep [^0-9] /etc/passwd grep "^root[a-z]*$' /etc/passwd grep "^[rb]" /etc/passwd grep "[^r]oo" /etc/passwd grep '^$' /etc/passwd grep '[^a-zA-Z]' /etc/passwd
- 模糊字串匹配
grep 'r..t' /etc/passwd grep 'oo*' /etc/passwd #“*”表示零個或多個前面的字元,oo*表示o, oo, ooo..... grep '.*' /etc/passwd |wc -l # ‘.*’表示零個或多個任意字元,空行也包含在內 grep 'o\{2\}' /etc/passwd
- grep擴充套件命令,egrep
egrep 'o+' 1.txt # 表示1個或1個以上前面字元 egrep 'o?' 1.txt # 表示0個或者1個前面字元 egrep 'roo|body' 1.txt # 匹配roo或者匹配body egrep 'r(oo)|(at)o' 1.txt # 用括號表示一個整體 egrep '(oo)+' 1.txt # 表示1個或者多個 'oo'
. * + ? 總結
. 表示任意一個字元(包括特殊字元)- 表示零個或多個*前面的字元
.* 表示任意個任意字元(包含空行)
+ 表示1個或多個+前面的字元
? 表示0個或1個?前面的字元
其中,+ ? grep不支援,egrep才支援。
- 表示零個或多個*前面的字元
sed
sed: stream editor for filtering and transforming text 使用者過濾和轉換文字的流編輯器
sed 主要是用來實現查詢 替換功能。
命令格式:“sed [option] 'sed command' filename”
- option 引數說明
-n :只打印模式匹配的行
-e :直接在命令列模式上進行sed動作編輯,此為預設選項
-r :支援擴充套件表示式
-i :直接修改檔案內容