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

正則介紹:grep和egrep

什麼是正則表示式? 正則表示式就是處理字串的方法,它是以行為單位來進行字串的處理行為,正則表示式通過一些特殊符號的輔助,可以讓使用者輕易達到查詢、刪除、替換特定字串的處理程式 一、grep 1. grep   過濾檔案關鍵字 [[email protected] grep]# grep 'root' wd.txt        #過濾wd.txt檔案中有root的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 2. grep -c   統計關鍵字共有多少行 [[email protected] grep]# grep -c 'root' wd.txt      #統計wd.txt檔案中有多少帶有root的行數 2 3. grep -n   顯示關鍵字所在行的行號 [
[email protected]
grep]# grep -n 'root' wd.txt      #
顯示wd.txt檔案中root關鍵字所在行的行號 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 4. grep -i    不區分大小寫 [[email protected] grep]# grep -i 'root' wd.txt          #不區分大小寫搜尋帶有root的行 ROOTt:x:0:0:ROOT:/ROOT:/bin/bash                            #這裡的ROOT為大寫
operator:x:11:0:operator:/root:/sbin/nologin 5. grep -v   取反,過濾出不帶關鍵字的行 [[email protected] grep]# grep -v 'nologin' wd.txt       #過濾出wd.txt中不帶nologin的行 root:x:0:0:ROOT:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt lx01:x:1000:1000::/home/lx01:/bin/bash
lx02:x:1001:1001::/home/lx02:/bin/bash lx03:x:1002:1003::/home/lx03:/bin/bash mk100:x:1007:1007::/home/mk100:/bin/bash 6. grep -r   遍歷目錄下所有的檔案和子目錄,找到帶有關鍵字的檔案的行                 [[email protected] grep]# grep -r 'ens33' /etc/             #過濾出/etc/目錄下所有檔案帶有enss33的行 /etc/sysconfig/network-scripts/ifcfg-ens33:NAME=ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:DEVICE=ens33 7. grep -A   A後面接數字,過濾出符合要求的行及下面的n行 [[email protected] grep]# grep -nA2 'root' wd.txt     #過濾出passwd中帶root的行,-A2並且把這一行下面的2行也顯示出來 1:root:x:0:0:ROOT:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologi     grep -B   B後面接數字,過濾出符合要求的行及上面的n行 [[email protected] grep]# grep -nB2 'root' wd.txt       #過濾出passwd中帶root的行,-B2並且把這一行上面的2行也顯示出來 1:root:x:0:0:ROOT:/root:/bin/bash # -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin   grep -C   C後面接數字,過濾出符合要求的行及上下n行 [[email protected] grep]# grep -nC2 'root' wd.txt        #過濾出passwd中帶root的行,-C2並且把這一行上下的2行都顯示出來 1:root:x:0:0:ROOT:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 二、正則的一些示例 1. grep '[0-9]' 過濾檔案中所有帶數字的行 [[email protected] grep]# grep '[0-9]' /etc/passwd      #過濾出/etc/pass中所有不帶數字的行 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin ....... 2. grep -v '[0-9]'   過濾出所有不帶數字的行 [[email protected] grep]# grep -v '[0-9]' /etc/passwd      #過濾出/etc/pass中所有不帶數字的行 3. grep '^'             ^表示開始,後面跟字元,可以過濾以你填入的字元開頭的行,同樣可以使用-v取反 [[email protected] grep]# grep '^r' /etc/passwd          #過濾出/etc/passwd檔案中以r開頭的行 root:x:0:0:root:/root:/bin/bash 4. grep '[^0-9]'    匹配非數字的字元,^放到方括號[]裡面的意思是取非
5. grep '^[^0-9]'    匹配非數字開頭的行
6. grep 'r.o'    "."表示任意一個字元 [[email protected] grep]# grep 'r.o' wd.txt root:x:0:0:ROOT:/root:/bin/bash rto srgo operator:x:11:0:operator:/root:/sbin/nologin 7. grep 'r*o'  "*" 表示匹配*前面的字元,可以重複n次, [[email protected] grep]# grep 'r*o' wd.txt root:x:0:0:ROOT:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin rto srgo rddfgo mail:x:8:12:mail:/var/spool/mail:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin ooooo 8. grep '.*'          .和*組合起來表示任意個任意字元,0個也可以,表示全部 [[email protected] grep]# grep '.*' wd.txt 9. grep 'o\{2\}'   {}在正則裡面使用表示範圍,直接使用識別不了,需要脫義,不過不想脫義,那麼使用加上引數-E也是可以的 1. [[email protected] grep]# grep 'o\{2\}' wd.txt     #表示匹配wd.txt檔案中出現兩次o的行     root:x:0:0:ROOT:/root:/bin/bash     lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     mail:x:8:12:mail:/var/spool/mail:/sbin/nologin     operator:x:11:0:operator:/rooooot:/sbin/nologin     ooooo 2. [[email protected] grep]# grep -E 'o{2}' wd.txt    #加上-E效果是一樣的     root:x:0:0:ROOT:/root:/bin/bash     lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin     mail:x:8:12:mail:/var/spool/mail:/sbin/nologin     operator:x:11:0:operator:/rooooot:/sbin/nologin     ooooo 三、egrep 1. egrep 'o{3}'    egrep是grep的擴充套件,使用egrep時,特殊字元不需要脫義 [[email protected] grep]# egrep 'o{3}' wd.txt operator:x:11:0:operator:/rooooot:/sbin/nologin ooooo dbus:x:81:81:System message bus:/:/sbin/nooologin 2. egrep  '(oo){2}'  使用小括號(),表示一個整體 [[email protected] grep]# grep -E '(oo){2}' wd.txt           #表示兩個oo出現兩次,那麼就是四個o operator:x:11:0:operator:/rooooot:/sbin/nologin ooooo 3. egrep 'o+t'      +號前面的字元可以有1個或者多個,不能是0個 [[email protected] grep]# egrep 'o+t' wd.txt root:x:0:0:ROOT:/root:/bin/bash operator:x:11:0:operator:/rooooot:/sbin/nologin 4. egrep 'o?t'       ?號前面的字元可以是0個或1個 [[email protected] grep]# egrep 'o?23' wd.txt 233sss 5. egrep 'root|bash'   |表示或者, [[email protected] grep]# egrep 'root|bash' wd.txt root:x:0:0:ROOT:/root:/bin/bash lx01:x:1000:1000::/home/lx01:/bin/bash lx02:x:1001:1001::/home/lx02:/bin/bash lx03:x:1002:1003::/home/lx03:/bin/bash mk100:x:1007:1007::/home/mk100:/bin/bash 6. grep -r --include=         過濾出一個目錄下指定含有關鍵字文件,且含有指定關鍵字的行 [[email protected] grep]# grep -r --include="passwd" 'root' /etc/ /etc/passwd:root:x:0:0:root:/root:/bin/bash /etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin 把一個目錄下,過濾所有*.php文件中含有eval的行 grep -r --include="*.php" 'eval' /data/