1. 程式人生 > >正則介紹 grep

正則介紹 grep

正則介紹 grep

什麽是正則

技術分享圖片

1、grep 的常用選項

技術分享圖片

grep 是用來過濾指定關鍵詞的。具體操作,見下圖,
技術分享圖片
grep 有個比較好的特點,自帶顏色在過濾關鍵詞上。不加顏色的話,就使用絕對路徑,見下圖,
技術分享圖片
不加顏色的話,看起來比較費勁。
接著來看一下各個選項的作用,見下圖,
技術分享圖片
-c 查看行數,-n 顯示行號,-i 不區分大小寫的話,先來編輯一下 passwd 文件,進入下圖,
技術分享圖片
將上圖中紅色框框的位置,改動三個字母為大寫字母 NOL ,保存後退出。接著下圖操作,
技術分享圖片
讓 -n 與 -ni 做對比之後,不難發現, -ni 的結果多了第2行的大寫的 NOLogin 。-i 的作用就是不區分大小寫。接著查看其他選項的作用,見下圖,
技術分享圖片
-v 是取反的作用,上面的命令就是列出不含”nologin“的行項,可以看最前面的行數與上個命令結果做對比,可以發現是互補的。接著查看 -r 的作用,見下圖,

技術分享圖片
包含 root 的結果內容太多,不一一截屏。
技術分享圖片
以上說明,grep -r 可以作用在目錄上,查找目錄及所有的子目錄內包含”root“的內容,去掉 -r 就只能作用在文件上。 如果想知道 -r 選項這邊有沒有把 passwd 內的 root 列出來,可以按下圖操作,
技術分享圖片
將 -r 的結果內容重定向到文件 /tmp/grep.log 中,然後過濾出包含 passwd 的內容。
接著查看其他選項,見下圖,
技術分享圖片
-A 後面跟數字,過濾出符合要求的行以及下面n行
-B 同上,過濾出符合要求的行以及上面n行
-C 同上,同時過濾出符合要求的行以及上下各n行
以上就是 grep 的常用選項。

2、grep 正則表達式

技術分享圖片

先查看下圖例子,

技術分享圖片
輸出的結果全部包含 0-9 的數字,[ ] 表示一個範圍。接著使用 -v 選項來查看沒有包含數字的結果,見下圖,
技術分享圖片
結果顯示 passwd 文件裏面完全沒有不包含數字的行項目,接著在文件 inittab 裏面有查到不包含數字的行項目,缺少9行和10行,說明這兩行裏面包含數字,可以使用 vim /etc/inittab 命令進入驗證結果,見下圖,
技術分享圖片
在 vim 裏面輸入”:set nu“,可以顯示行數,然後就可以看到9、10行裏面確實包含數字。

^ 表示以後面跟的內容開頭,見下圖例子,
技術分享圖片
inittab 文件裏面全部是以#開頭的文件,前面的行數都是連續的,並且可以和上上圖的內容驗證。現在要改動 inittab 文件裏面的內容,先拷貝一份文件到當前目錄下,這裏需要註意的是,改動的內容必須是拷貝的文件,不能去動原文件。這是比較安全的做法,系統自帶的文件不能輕易更改,否則會導致系統啟動不了。

執行命令 vim inittab ,回車,見入下圖,
技術分享圖片
在紅色框框中隨機增加一行不以#開頭的內容,保存後退出。接著下圖操作,
技術分享圖片
可以看到,當前目錄下的 inittab 文件中14行的內容沒有出現,說明第14行不符合要求,這一行就是剛剛改動的不以#開頭的行項目。接著加上 -v 選項來查看一下,見下圖,
技術分享圖片
可以看出,14行就是不以#開頭的行。以#開頭的行都是解釋說明的內容,沒有實際意義,以後工作中想避開這些解釋說明的內容,就可以使用此方法。
現在還是在文件 inittab 中,更改一下內容,輸入命令 vim inittab ,回車,見下圖,
技術分享圖片
更改上圖紅色框框的內容,保存後退出。接著往下操作,
技術分享圖片
結果是一樣的。接著操作其他內容,見下圖,
技術分享圖片
可以看到,命令結果除了數字3和5,其余全部顯示紅色。說明 [^0-9] 表示的是非 0-9 的一個字符。接著驗證一下,再次更改一下文件 inittab 的內容,見下圖,
技術分享圖片
增加上圖紅色框框的內容,保存後退出。接著往下操作,
技術分享圖片
可以看到,新增加的行項目裏面,只有a符合要求,a是紅色的。再往下操作,
技術分享圖片
上圖中,^[^0-9] 表示的是以非數字開頭的行。加上行數,再查看一遍,見下圖,
技術分享圖片
總結一下 ^ 的作用,把 ^ 放在 [ ] 裏面,表示取反,非的意思。放在 [ ] 外面就是以後面的內容開頭。

接著看下圖,
技術分享圖片
要想知道上圖的 ‘r.o‘ 什麽意思,先進入 passwd 文件更改一下內容,見下圖,
技術分享圖片
增加上圖兩行紅色框框的內容,保存後退出。接著往下操作,
技術分享圖片
對比一下兩條命令的結果,後面編輯的 rao 和 r>o ,也都能被匹配到。所以 ‘r.o‘ 裏面的 . 表示一個任意的字符。那麽能不能匹配到 . 呢?接著做實驗,先更改一下 passwd 文件的內容,見下圖,
技術分享圖片
把 > 改成 . ,保存後退出。重新過濾,見下圖,
技術分享圖片
也是可以匹配到 . 的。
還有一個特殊符號 (星號),操作之前還是先更改一下 passwd 文件的內容,見下圖,
技術分享圖片
將上圖紅色框框的內容更改一下,保存後退出。接著往下操作,
技術分享圖片
可以看出 ‘r.o‘ 的結果,除了大寫的 O ,其余的小寫 o 全部出現了。所以
(星號)的意思是, (星號) 右邊的字符表示需要匹配的內容,左邊的字符表示重復 0-n 次,n 是一個隨意的數字。‘oo‘ 中的0次就表示只有一個 o ,所以該命令的結果是,一個 o 和多個 o ,都匹配了。簡單來說,‘oo‘ 表示 n 個 o 。
接著把 . 和 (星號)放在一起,做實驗,見下圖,
技術分享圖片
可以看到所有的字符都匹配到了,說明‘.’表示任意的任意字符,0個也可以。假如想匹配其中的一行字符,具體操作見下圖,
技術分享圖片
接著操作花括號 { } ,\ (脫義符號)把它原本的含義去掉,見下圖,
技術分享圖片
在 grep 當中,直接使用 { } 花括號,是沒有任何意義的,就單純表示為花括號。而在正則當中,{ } 花括號表示的是一個範圍,真正的寫法是 grep ‘o{2}‘ passwd ,其中的 ‘o{2}‘ 表示o出現2次。但是命令直接這樣寫的話,結果又不能匹配,需要做一個脫義。正確的寫法就是上圖出現結果的命令 grep ‘o{2}‘ passwd 。而這個命令中4個 o 的字符為什麽可以識別到呢,實際上應該理解為分別的2個 o 。後面還可以有另外一種寫法,grep ‘o{0,3}‘ passwd ,表示1到3個 o 都是可以匹配的。不過這種寫法,一般很少用到。
如果覺得上面的 \ (脫義符號)看著不舒服的話,可以使用 egrep 命令,這樣就不需要用到 \ (脫義符號)了。見下圖,
技術分享圖片
還可以使用 grep -E 命令,這個命令和 egrep 命令的效果是一樣的,並且都不需要用到 \ (脫義符號)。還有一種寫法,見下圖,
技術分享圖片
上面的 ‘(oo){2}‘ 表示 oo 出現2次,就是 4 個 o 。
綜上,{ } 花括號表示前面字符的重復範圍。
接著介紹一個特殊符號 + (加號),它與 (星號)挺像的,見下圖,
技術分享圖片
上圖中的 ‘o+o‘ ,表示+號前面字符的1次或多次,它與 (星號)的差別在於,(星號)表示的是 0 次或多次。當然,這邊把後面的字符 o 換成其他字符,應該會比較清晰,見下圖,
技術分享圖片
接著介紹 ?號,見下圖,
技術分享圖片
?號表示 ?號前面字符的重復次數為0次或1次。上面的例子不夠特殊,自己寫幾個上去,輸入命令 vi passwd ,回車,見下圖,
技術分享圖片
更改上圖兩個紅色框框的內容,保存後退出。接著往下操作,
技術分享圖片
可以驗證,?表示 ?前面的字符重復0次或1次。
接著介紹 |(豎線),它表示或者的意思,可以多個字符串操作,見下圖,
技術分享圖片
也可以不區分大小寫,加上 -i 選項,見下圖,
技術分享圖片

總結:
. 表示任意一個字符
(星)表示0個或多個前面的字符
. 表示通配
{ } 表示前面字符的範圍

  • 表示1個或多個前面的字符
    ?表示0個或1個前面的字符
    | 表示或者

正則介紹 grep