什麼是正則正則表達式
一、grep 的經常使用選項vim
grep 是用來過濾指定關鍵詞的。具體操做,見下圖,安全
grep 有個比較好的特色,自帶顏色在過濾關鍵詞上。想不加顏色的話,就使用絕對路徑,見下圖,3d
不加顏色的話,看起來比較費勁。blog
接着來看一下各個選項的做用,見下圖,字符串
-c 查看行數,-n 顯示行號,-i 不區分大小寫的話,先來編輯一下 passwd 文件,進入下圖,it
將上圖中紅色框框的位置,改動三個字母爲大寫字母 NOL ,保存後退出。接着下圖操做,grep
讓 -n 與 -ni 作對比以後,不難發現, -ni 的結果多了第2行的大寫的 NOLogin 。-i 的做用就是不區分大小寫。接着查看其餘選項的做用,見下圖,方法
-v 是取反的做用,上面的命令就是列出不含」nologin「的行項,能夠看最前面的行數與上個命令結果作對比,能夠發現是互補的。接着查看 -r 的做用,見下圖,im
包含 root 的結果內容太多,不一一截屏。
以上說明,grep -r 能夠做用在目錄上,查找目錄及全部的子目錄內包含」root「的內容,去掉 -r 就只能做用在文件上。 若是想知道 -r 選項這邊有沒有把 passwd 內的 root 列出來,能夠按下圖操做,
將 -r 的結果內容重定向到文件 /tmp/grep.log 中,而後過濾出包含 passwd 的內容。
接着查看其餘選項,見下圖,
-A 後面跟數字,過濾出符合要求的行以及下面n行
-B 同上,過濾出符合要求的行以及上面n行
-C 同上,同時過濾出符合要求的行以及上下各n行
以上就是 grep 的經常使用選項。
二、grep 正則表達式
先查看下圖例子,
輸出的結果所有包含 0-9 的數字,[ ] 表示一個範圍。接着使用 -v 選項來查看沒有包含數字的結果,見下圖,
結果顯示 passwd 文件裏面徹底沒有不包含數字的行項目,接着在文件 inittab 裏面有查到不包含數字的行項目,缺乏9行和10行,說明這兩行裏面包含數字,可使用 vim /etc/inittab 命令進入驗證結果,見下圖,
在 vim 裏面輸入」:set nu「,能夠顯示行數,而後就能夠看到九、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 是一個隨意的數字。'o*o' 中的0次就表示只有一個 o ,因此該命令的結果是,一個 o 和多個 o ,都匹配了。簡單來講,'o*o' 表示 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個前面的字符
| 表示或者
^ 表示之後面跟的內容開頭
[ ] 表示一個範圍
[^ ] 表示取反,就是非的意思