什么是正则表达式?
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换特定字符串的处理程序
一、grep
1. grep 过滤文件关键字
[root@localhost 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 统计关键字共有多少行
[root@localhost grep]# grep -c 'root' wd.txt #统计wd.txt文件中有多少带有root的行数
2
3. grep -n 显示关键字所在行的行号
[root@localhost 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 不区分大小写
[root@localhost 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 取反,过滤出不带关键字的行
[root@localhost 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 遍历目录下所有的文件和子目录,找到带有关键字的文件的行
[root@localhost 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行
[root@localhost 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行
[root@localhost 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行
[root@localhost 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]'
过滤文件中所有带数字的行
[root@localhost 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]'
过滤出所有不带数字的行
[root@localhost grep]# grep -v '[0-9]' /etc/passwd #过滤出/etc/pass中所有不带数字的行
3. grep
'^' ^表示开始,后面跟字符,可以过滤以你填入的字符开头的行,同样可以使用-v取反
[root@localhost 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'
"."表示任意一个字符
[root@localhost 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次,
[root@localhost 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个也可以,表示全部
[root@localhost grep]# grep '.*' wd.txt
9. grep
'o\{2\}' {}在正则里面使用表示范围,直接使用识别不了,需要脱义,不过不想脱义,那么使用加上参数-E也是可以的
1. [root@localhost 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. [root@localhost 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时,特殊字符不需要脱义
[root@localhost 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}'
使用小括号(),表示一个整体
[root@localhost grep]# grep -E '(oo){2}' wd.txt #表示两个oo出现两次,那么就是四个o
operator:x:11:0:operator:/rooooot:/sbin/nologin
ooooo
3. egrep
'o+t' +号前面的字符可以有1个或者多个,不能是0个
[root@localhost 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个
[root@localhost grep]# egrep 'o?23' wd.txt
233sss
5. egrep
'root|bash' |表示或者,
[root@localhost 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= 过滤出一个目录下指定含有关键字文档,且含有指定关键字的行
[root@localhost 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/