什么是正则表达式?
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换特定字符串的处理程序
一、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的行
ROOT
t: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.
g
rep -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
roo
t:x:0:0:ROOT:/
roo
t:/bin/bash
rto
s
rgo
operator:x:11:0:operator:/root:/sbin/nologin
7.
grep
'
r*o
'
"*" 表示匹配*前面的字符,可以重复n次,
[root@localhost grep]# grep 'r*o' wd.txt
roo
t:x:0:0:ROOT:/
roo
t:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
rt
o
srg
o
rddfg
o
mail:x:8:12:mail:/var/sp
oo
l/mail:/sbin/nologin
systemd-netw
o
rk:x:192:192:systemd Netw
o
rk Management:/:/sbin/n
o
l
o
gin
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的行
r
oo
t:x:0:0:ROOT:/r
oo
t:/bin/bash
lp:x:4:7:lp:/var/sp
oo
l/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/r
oooo
ot:/sbin/nologin
oooo
o
2. [root@localhost grep]# grep -E 'o{2}' wd.txt #加上-E效果是一样的
r
oo
t:x:0:0:ROOT:/r
oo
t:/bin/bash
lp:x:4:7:lp:/var/sp
oo
l/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/r
oooo
ot:/sbin/nologin
oooo
o
三、egrep
1.
egrep
'
o{3}
' egrep是grep的扩展,使用egrep时,特殊字符不需要脱义
[root@localhost grep]# egrep 'o{3}' wd.txt
operator:x:11:0:operator:/r
ooo
oot:/sbin/nologin
ooo
oo
dbus:x:81:81:System message bus:/:/sbin/n
ooo
login
2.
egrep
'
(oo){2}
'
使用小括号(),表示一个整体
[root@localhost grep]# grep -E '(oo){2}' wd.txt #表示两个oo出现两次,那么就是四个o
operator:x:11:0:operator:/r
oooo
ot:/sbin/nologin
oooo
o
3.
egrep
'
o+t
' +号前面的字符可以有1个或者多个,不能是0个
[root@localhost grep]# egrep 'o+t' wd.txt
r
oot
:x:0:0:ROOT:/r
oot
:/bin/bash
operator:x:11:0:operator:/r
ooooot
:/sbin/nologin
4.
egrep
'
o?t
' ?号前面的字符可以是0个或1个
[root@localhost grep]# egrep 'o?23' wd.txt
23
3sss
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/