Linux正则表达式grep与egrep(2)

'*'代表零个或多个任意的字符
'ooo*'代表oo,ooo,oooo 或者更多的o
[root@ linuxidc.com ~]# grep 'ooo*' /etc/passwd
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

'.*'表示零个或多个任意字符,等于所有的,空行也包含在内。
[root@ linuxidc.com ~]# grep '.*' /etc/passwd |wc -l
24
[root@ linuxidc.com ~]# wc -l /etc/passwd
24 /etc/passwd

指定要过滤字符出现的次数
{ }内部为数字,表示前面字符要重复的次数。表示两个O即包含OO的行。{ }左右都需要加脱意字符\
grep -E 代表增强版的grep即egrep,使用egrep不需要脱意;
123456789 [root@ linuxidc.com ~]# grep 'o\{2\}' /etc/passwd
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost ~]# grep -E 'o{2}' passwd 
[root@localhost ~]# egrep 'o{2}' passwd

[root@ linuxidc.com ~]# cat test.txt 
root:hot
abcde
spoool
spool
spol
spl

示例,过滤字母o出现1到3次的行

[root@ linuxidc.com ~]# grep 'o\{1,3\}' test.txt 
root:hot
spoool
spool
spol

{ } 还可以表示一个范围,格式为{n1,n2} n1<n2 表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。

egrep为grep的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。
grep -E = egrep

1、筛选一个或一个以上前面的字符    字符后面使用+
[root@ linuxidc.com ~]# cat test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@ linuxidc.com ~]# egrep 'o+' test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'oo+' test.txt 
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'ooo+' test.txt 
rooooot:x:0:0/roooooot:/bin/bash

2、筛选零个或一个前面的字符    字符后面使用?

[root@ linuxidc.com ~]# egrep 'o?' test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@ linuxidc.com ~]# egrep 'oo?' test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'ooo?' test.txt 
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'oooo?' test.txt 
rooooot:x:0:0/roooooot:/bin/bash

3、筛选字符串1或字符串2    包含里面任意一个字符串的打印出来

[root@ linuxidc.com ~]# egrep 'aaa|111|ooo' test.txt 
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

4、egrep中()的应用

[root@ linuxidc.com ~]# egrep 'r(oo)|(mo)n' test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash

用( )表示一个整体,例如(oo)+ 表示1个'oo'或者多个'oo'

[root@ linuxidc.com ~]# egrep '(oo)+' test.txt 
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

5、egrep中[ ]的应用   

方括号内的字符为其中的一个;[^o]为除了字母o之外的;
示例:r开头t结尾的;;
[root@localhost ~]# egrep 'r[o]t' test.txt 
rot:x:0:0:rot:/rot:/bin/bash

r开头后面有o的

[root@localhost ~]# egrep 'r[o]' test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash

r开头后面不是o的;

[root@localhost ~]# egrep 'r[^o]' test.txt 
rrt
rtx

t为结尾的前面字符不是o的;

[root@localhost ~]# egrep '[^o]t' test.txt 
rrt
rtx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/16447.html