正則介紹 grep 上中下

正則介紹 grep

  • egrep 是 grep 的擴展
  • 如圖, grep 'nologin' passwd 能夠搜索passwd中含有nologin的數據行
  • 而後用顏色顯示 nologin
  • which grep 能夠看到 grep 是一個 alias
  • 之因此可以用顏色顯示nologin 是由於
  • 這個 alias 包含了 --color=auto 自動顯示顏色的設置

  • 參數 -c 能夠統計包含nologin的數據行的數量
  • 這裏是18,表示有18行

  • 參數 -n 能夠顯示行號
  • 如圖最左邊,暗綠色顯示的數字就是每一行的行號

  • 如圖,參數 i 能夠不區分大小寫
  • 下面的搜索結果,NOLogin 和 nologin 都搜索出來了
  • 若是不加 i 參數,會嚴格按照大小寫來搜索

  • 參數 v 是取反的意思
  • 通常來講,grep 'nologin' passwd 是把包含nologin的數據行篩選出來
  • 如圖,使用 v 參數,那麼效果就是把不包含nologin的數據行篩選出來
  • 就是把與篩選條件相反的結果篩選出來的意思

  • 參數 -r 能夠遍歷目錄裏面全部的子文件和子目錄裏面的文件
  • grep 通常是對文件內容進行篩選,使用對象是文件不能是目錄
  • 可是 r 參數的意思是,能夠遍歷目錄裏面的全部文件和子目錄裏面的文件內容
  • 而後篩選出全部包含關鍵詞的數據行
  • 因此使用 r 參數就能夠對目錄進行 grep 操做
  • 如圖,grep -r 'root' /etc/ > /tmp/grep.log
  • 意思是,遍歷/etc/目錄裏面全部文件,包括子目錄裏面的文件
  • 篩選出全部的包含關鍵字 'root' 的數據行
  • 而後重定向,也就是說寫入 grep.log 文件裏面
  • 而後 grep passwd /tmp/grep.log
  • 意思是從 grep.log 文件裏面篩選出全部包含 passwd 關鍵字的數據行

  • 關於grep後面的關鍵字加不加引號

  • 還有一個參數 A+數字n,能夠顯示關鍵字數據行和下面的n行
  • 例子,如圖, grep -nA2 'root' passwd
  • 這條命令會把包含關鍵字 root 的數據行都篩選出來
  • 由於A後面的數字是2,因此還會顯示root數據行下面的兩行
  • 如圖,第一行數據行包含root,這一行下面的兩行也會篩選出來
  • 而後找到第二行包含root關鍵字的數據行
  • 而後把第二行root數據行下面的兩行也篩選出來,以此類推

  • 除了參數 A,還有參數 B
  • 區別是,A+數字n 能夠篩選出關鍵字行和該行的下面 n 行
  • 而 B+數字n 就能夠篩選出關鍵字行和該行的上面 n 行
  • 如圖,第一行root數據行上面沒有數據,由於這一行上面原本就沒有數據行了
  • 第二行root數據行和該行的上面兩行數據都被篩選出來了

  • 還有參數 C+數字n
  • A是篩選下面n行,B是篩選上面n行,C能夠上下各n行
  • 如圖,grep -nC2 'root' passwd
  • 首先,能夠把 root 關鍵字的行篩選出來
  • 而後還能夠把每一行 root數據行 的上面2行和下面2行也篩選出來
  • 第一個root數據行由於上面沒有數據因此沒有顯示
  • 第二個root數據行的上下2行都被篩選出來了

  • grep '[0-9]' passwd
  • 其中 [0-9] 表示0到9裏面任意一個數字
  • 這個篩選條件表示全部數據行裏面,任何一行存在0-9任意一個數字的數據行都會被篩選
  • 也就是說,任何存在數字的數據行都會被篩選
  • 若是想篩選出不存在數字的行
  • 可使用 grep -v '[0-9]' passwd
  • 參數 v 是取反,這樣就會把沒有數字的行篩選出來

  • 上圖的篩選條件是 '^#'
  • 符號 ^ 表示 以...開頭,因此 ^# 就表示以 # 開頭
  • 這條命令的意思就是 篩選出以 # 開頭的數據行
  • 能夠看到,下面的數據行全都是以#開頭的
  • 若是使用 -v 參數就能夠把 不以#開頭的行篩選出來

  • 符號 ^ 有兩種含義,在方括號[]外面的含義是 以...開頭
  • 在方括號[]裏面的含義是 非 的意思
  • 如圖,grep '[^0-9]' inittab
  • 這裏 ^ 的位置是在方括號[]裏面,因此意思是 非
  • 那麼 [^0-9] 就表示 非 0-9 任意一個數字
  • 也就是非數字的意思
  • 看下面的篩選內容,能夠看到,非數字全都紅色高亮顯示
  • 而數字則是白色,說明全部數字都不是關鍵字

  • 如圖,grep '^[^0-9]' inittab
  • 這裏篩選條件是 '^[^0-9]'
  • 由於 ^ 在方括號[]外面時候的含義是 以...開頭 的意思
  • [^0-9] 是非數字的意思
  • 因此 '^[^0-9]' 就表示 以非數字開頭的數據行
  • 看下面篩選出來的數據行,全都是非數字開頭的
  • 如圖,使用 v 參數取反結果
  • 能夠篩選出 以數字開頭的數據行
  • 還有一點,使用取反操做的時候,篩選關鍵字是不會高亮顯示的
  • 非取反操做的時候纔會高亮顯示關鍵字

  • 如圖,篩選條件是 'r.o' ,符號 . 表明一位字符
  • 一位字符能夠是任意字符
  • r.o 意思就是 r 開頭,o 結尾,中間能夠是任意一位字符
  • 看下面的篩選結果
  • 高亮顯示的關鍵字,有 roo,rao,r.o
  • 全部關鍵字都是r開頭o結尾,中間任意一位字符

  • 這裏的篩選條件是 'o*o'
  • 右邊的 o 表示關鍵字是以 o 結尾的
  • 左邊的 o* 表示任意個 o
  • o* 表示 0-n 個 o ,若是爲0,就是沒有 o
  • 結合起來,篩選條件意思是,關鍵字就是 任意個o + o
  • 看下面篩選結果,有一個o的,這就是左邊o*爲0個o的結果
  • 有兩個o的,這就是左邊 o* 爲 1 的結果
  • 左邊也能夠有更多個o,若是有這樣的數據行的話

  • 還能夠把 * 和 . 結合起來使用
  • 符號 . 表明一位字符
  • 符號 x* 表明 0-n 個 x
  • 那麼 .* 就表明 0-n 個一位字符,也就是任意長度的字符
  • 如圖,篩選條件是 'aming.*bash'
  • 這表示,以 aming 開始
  • 以 bash 結束
  • 中間是 .* 表明任意長度的字符
  • 符合這個格式的關鍵詞數據行會被篩選出來
  • 結果就是 aming開始,而後任意字符串,而後bash結尾的關鍵字

  • 還可使用花括號{}指定範圍
  • 如圖 'o{2}' 表示篩選出o連續出現兩次的關鍵字的數據行
  • 之因此加轉義字符 \ 是由於在grep裏面,花括號{}是不識別的
  • 想令花括號{}被識別產生做用就須要轉義一下

  • 使用 egrep 就能夠不用轉義,由於 egrep 是支持花括號的
  • 如圖,使用 egrep 的時候,就不須要寫轉義符
  • 如圖 grep -E 就至關於在使用 egrep
  • 參數 -E 就表示使用的是 egrep
  • 因此也能夠不須要轉義字符

  • 如圖,能夠把 oo 用小括號括起來,表示這是一個總體
  • 後面使用{2}表示連續出現兩次
  • 那麼 oo 連續出現兩次就是 oooo
  • 看篩選結果,關鍵字就是 oooo
  • 使用小括號的時候,也須要用 -E 或者 egrep,由於grep不識別小括號
  • 否則就須要用轉義字符轉義小括號

  • 特殊符號 + 做用跟 * 差很少
  • 它們的區別是 *表示0-n ,+ 表示 1-n
  • 星號最小個數是0,也就是沒有,+的最小個數是1,也就是最少要有一個相關字符
  • 如圖,關鍵字條件是 'o+t'
  • o+ 表示關鍵字左邊最少有 1個 o 或者 n個 o
  • 右邊以 t 結尾
  • 看篩選結果,oot, 左邊是2個o,右邊以 t 結尾
  • 還有一個問題,egrep也是不識別 + 號的,使用須要用轉義字符
  • 或者使用 egrep 或 -E 就能夠直接識別,不用轉義

  • 如圖,特殊符號 ? 號, 表示 0 或 1
  • 上圖,o? 表示 0個o 或者 1個o
  • 意思就是右邊以 1o 結尾,左邊能夠有0個或者1個o
  • 看下面篩選結果有 1o,o1o
  • 1o 就是左邊有0個o,o1o就是左邊有1個o
  • 要使用?號,也是須要用 egrep 或者 -E

  • 符號 | 是 或 的意思,使用這個功能也須要使用 egrep 或者 -E 參數
  • 如圖,第一行命令,篩選 root或者Bus或者997的關鍵字出來
  • 下面能夠看到,root,Bus,997關鍵字都高亮顯示了
  • 第二條命令,-E後面添加了一個 i 參數
  • 意思是忽略大小寫
  • 篩選條件裏面的 bus或者root,能夠篩選出任意字母是大寫或者小寫的
  • 好比這裏,篩選條件寫了 bus
  • 可是篩選結果出現了 Bus ,若是不用 i 參數
  • bus裏面任意一個或者幾個字母若是跟條件處的大小寫不一致
  • 就不會被篩選出來,如今能夠篩選任意字母大小寫的 bus 出來
相關文章
相關標籤/搜索