1、什么是正则表达式?
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
2、特殊正则字符更多正则符号了解点击这里
grep不支持的字符:
3、正则表达式的分类
4、案例
1、查找不以大写字母开头的行
(1)
[root@server1 shells]# grep -v ^[A-Z] /etc/passwd
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
(2)
[root@server1 shells]# grep ^[^[:upper:]] /etc/passwd //第一个^解释以...开头,第二个^解释除了...
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
(3)
[root@server1 shells]# grep [^A-Z] /etc/passwd
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2、查找有数字的行
(1)
[root@server1 shells]# grep [1-9] /etc/passwd
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
(2)
[root@server1 shells]# grep [[:digit:]] /etc/passwd
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
3、查找一个数字和一个字母连起来的
(1)
[root@server1 shells]# grep [0-9][A-Za-z] /etc/passwd //数字在前,字母在后
45312xhdgshcj424cswad
4534vwajaw4542
(2)
[root@server1 shells]# grep -E '[0-9][A-Za-z]|[A-Za-z][0-9]' /etc/passwd //只要是字母和数字连一起,没有顺序
vdjkch8909
45312xhdgshcj424cswad
4534vwajaw4542
u1:x:1010:1012::/home/u1:/bin/bash
u2:x:1011:1013::/home/u2:/bin/bash
u3:x:1012:1014::/home/u3:/bin/bash
u4:x:1013:1015::/home/u4:/bin/bash
u5:x:1014:1016::/home/u5:/bin/bash
4、查找不以r开头的行
[root@server1 shells]# grep -v "^r" /etc/passwd
vdjkch8909
45312xhdgshcj424cswad
4534vwajaw4542
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
5、查找以数字开头的
(1)
[root@server1 shells]# grep ^[[:digit:]] /etc/passwd
45312xhdgshcj424cswad
4534vwajaw4542
1:x:4011:4011::/home/1:/bin/bash
2:x:4012:4012::/home/2:/bin/bash
3:x:4013:4013::/home/3:/bin/bash
4:x:4014:4014::/home/4:/bin/bash
(2)由于grep为贪婪模式,因此只要开头有一个为数字,整行就会显示,所以只要满足第一个开头为数字就匹配了,不管后面的。
[root@server1 shells]# grep ^[0-9] /etc/passwd
45312xhdgshcj424cswad
4534vwajaw4542
1:x:4011:4011::/home/1:/bin/bash
2:x:4012:4012::/home/2:/bin/bash
3:x:4013:4013::/home/3:/bin/bash
4:x:4014:4014::/home/4:/bin/bash
8、查找以“.”结束的
[root@server1 shells]# grep "\.$" /mnt/passwd //使用转义字符“\”,才能表示圆点为它自身意思
root:x:0:0:ROOT:/root:/bin/bash.
bin:x:1:1:bin:/bin:/sbin/nologin.
abrt:x:173:173::/etc/abrt:/sbin/nologin.
9、去掉空行
[root@server1 shells]# grep -v "^$" /mnt/passwd
10、查找完全匹配abc的行
(1)
[root@server1 shells]# grep -w abc /mnt/passwd
abc
(2)
[root@server1 shells]# grep "\<abc\>" /mnt/passwd //加双引号,可以翻译特殊字符\<...\>
abc
11、查找A后有三个数字的行
[root@server1 shells]# grep -E "A[0-9]{3}" /mnt/passwd //-E是因为grep即基本正则表达不支持{n}这个特殊符号
setroA4565634ubleshoot:x:995:992::/var/lib/setroubleshoot:/sbin/nologin
rpcuser:x:29:A453329:RPC Service User:/var/lib/nfs:/sbin/nologin
A456varnish:x:989:983:Varnish Cache:/var/lib/varnish:/sbin/nologin
12、统计root出现次数
[root@server1 shells]# grep -o root /mnt/passwd |wc -l //-o表示只显示root
3
13、找出全部是数字的行
[root@server1 shells]# grep -E "^[0-9]$" /mnt/passwd //匹配只有一个数字的行
[root@server1 shells]# grep -E "^[0-9]+" /mnt/passwd //匹配以>=1个数字开头的行
090808099rtkit:5345345x:172:172:RealtimeKit:/proc:/sbin/nologin
4563456315341
[root@server1 shells]# grep -E "^[0-9]+$" /mnt/passwd //匹配以这多个数字开头且以这多个数字结尾的行
4563456315341