正則介紹 grep

什麼是正則

正則介紹 grep

1、grep 的常用選項

正則介紹 grep

grep 是用來過濾指定關鍵詞的。具體操作,見下圖,
正則介紹 grep
grep 有個比較好的特點,自帶顏色在過濾關鍵詞上。不加顏色的話,就使用絕對路徑,見下圖,
正則介紹 grep
不加顏色的話,看起來比較費勁。
接着來看一下各個選項的作用,見下圖,
正則介紹 grep
-c 查看行數,-n 顯示行號,-i 不區分大小寫的話,先來編輯一下 passwd 文件,進入下圖,
正則介紹 grep
將上圖中紅色框框的位置,改動三個字母爲大寫字母 NOL ,保存後退出。接着下圖操作,
正則介紹 grep
讓 -n 與 -ni 做對比之後,不難發現, -ni 的結果多了第2行的大寫的 NOLogin 。-i 的作用就是不區分大小寫。接着查看其他選項的作用,見下圖,
正則介紹 grep
-v 是取反的作用,上面的命令就是列出不含”nologin“的行項,可以看最前面的行數與上個命令結果做對比,可以發現是互補的。接着查看 -r 的作用,見下圖,
正則介紹 grep
包含 root 的結果內容太多,不一一截屏。
正則介紹 grep
以上說明,grep -r 可以作用在目錄上,查找目錄及所有的子目錄內包含”root“的內容,去掉 -r 就只能作用在文件上。 如果想知道 -r 選項這邊有沒有把 passwd 內的 root 列出來,可以按下圖操作,
正則介紹 grep
將 -r 的結果內容重定向到文件 /tmp/grep.log 中,然後過濾出包含 passwd 的內容。
接着查看其他選項,見下圖,
正則介紹 grep
-A 後面跟數字,過濾出符合要求的行以及下面n行
-B 同上,過濾出符合要求的行以及上面n行
-C 同上,同時過濾出符合要求的行以及上下各n行
以上就是 grep 的常用選項。

2、grep 正則表達式

正則介紹 grep

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

^ 表示以後面跟的內容開頭,見下圖例子,
正則介紹 grep
inittab 文件裏面全部是以#開頭的文件,前面的行數都是連續的,並且可以和上上圖的內容驗證。現在要改動 inittab 文件裏面的內容,先拷貝一份文件到當前目錄下,這裏需要注意的是,改動的內容必須是拷貝的文件,不能去動原文件。這是比較安全的做法,系統自帶的文件不能輕易更改,否則會導致系統啓動不了。
執行命令 vim inittab ,回車,見入下圖,
正則介紹 grep
在紅色框框中隨機增加一行不以#開頭的內容,保存後退出。接着下圖操作,
正則介紹 grep
可以看到,當前目錄下的 inittab 文件中14行的內容沒有出現,說明第14行不符合要求,這一行就是剛剛改動的不以#開頭的行項目。接着加上 -v 選項來查看一下,見下圖,
正則介紹 grep
可以看出,14行就是不以#開頭的行。以#開頭的行都是解釋說明的內容,沒有實際意義,以後工作中想避開這些解釋說明的內容,就可以使用此方法。
現在還是在文件 inittab 中,更改一下內容,輸入命令 vim inittab ,回車,見下圖,
正則介紹 grep
更改上圖紅色框框的內容,保存後退出。接着往下操作,
正則介紹 grep
結果是一樣的。接着操作其他內容,見下圖,
正則介紹 grep
可以看到,命令結果除了數字3和5,其餘全部顯示紅色。說明 [^0-9] 表示的是非 0-9 的一個字符。接着驗證一下,再次更改一下文件 inittab 的內容,見下圖,
正則介紹 grep
增加上圖紅色框框的內容,保存後退出。接着往下操作,
正則介紹 grep
可以看到,新增加的行項目裏面,只有a符合要求,a是紅色的。再往下操作,
正則介紹 grep
上圖中,^[^0-9] 表示的是以非數字開頭的行。加上行數,再查看一遍,見下圖,
正則介紹 grep
總結一下 ^ 的作用,把 ^ 放在 [ ] 裏面,表示取反,非的意思。放在 [ ] 外面就是以後面的內容開頭。

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

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

  • (加號)表示1個或多個前面的字符
    ?表示0個或1個前面的字符
    | 表示或者
    ^ 表示以後面跟的內容開頭
    [ ] 表示一個範圍
    [^ ] 表示取反,就是非的意思
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章