正則介紹:grep和egrep
阿新 • • 發佈:2019-01-01
什麼是正則表示式?
正則表示式就是處理字串的方法,它是以行為單位來進行字串的處理行為,正則表示式通過一些特殊符號的輔助,可以讓使用者輕易達到查詢、刪除、替換特定字串的處理程式
一、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/
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/