正则表达式的重要性也不用我强调了,大家都懂的。需要说明的是,正则表达式是行处理工具,它会把匹配到的内容一行一行的显示出来。正则表达式分为:grep,egrep和fgrep。其中grep是基本正则;egrep是拓展正则;而fgrep为了查找速度快而舍弃了正则表达式,在此就不做说明了。
1 grep
1.1 用法:
grep [OPTIONS] PATTERN [FILE...]
1.1.1 OPTIONS
OPTIONS是选项的意思,grep的常用选项有:
-n:显示行号
-q:隐藏执行的结果
-i:不区分大小写
-o:只显示匹配到的内容而不是一整行
-v:只显示没有匹配到的内容。与-o相反
-E:使用扩展正则表达式。相当于egrep
-A #:显示被匹配到的行及其下#行
-B #:显示被匹配到的行及其上#行
-C #:显示被匹配到的行及其上和下#行
--color=auto:给匹配到的内容加上颜色
建议将grep -E --color=auto加入别名,酷炫!
1.1.2 PATTERN
PATTERN是模式的意思,grep支持的模式有很多
.:匹配任意单个字符
[[email protected] ~]# grep "." /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 ...
[]:匹配范围内的内容,可以是[5][s,w,t...][S-Z]等
[0-9]或者[[:digit:]]:所有数字
[a-z][[:lower:]]:小写字母
[A-Z][[:upper:]]:大写字母
[a-zA-Z][[:alpha:]]:所有字母
[0-9a-zA-Z][[:alnum:]]:所有数字和字母
[[:punct:]]:所有特殊符号
[[:space:]]:所有空格
注意:通配符中[a-z]表示所有字母
[[email protected] ~]# grep "[A-Z]" /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin ...
[^]:匹配范围之外的内容
[^0-9]或者[^[:digit:]]:除了数字之外的内容
*:匹配前面的内容任意次
.*:任意长度的任意字符
[[email protected] ~]# grep -o "r..t" /etc/passwd root root root root r/ft
\:脱义符,取消后面的字符原有的意思,赋予新的意思
\?:匹配前面的模式0次或1次,使用\重新赋予?新的含义
[[email protected] ~]# grep -o "r.\?.t" /etc/passwd root root root rat rat root r/ft rat
\+:匹配前面的模式1次或任意次
[[email protected] ~]# grep -o "r.\+t" /etc/passwd root:x:0:0:root:/root rator:x:11:0:operator:/root r:/var/ft rtkit:x:499:497:RealtimeKit r/lib/avahi-aut rt:x:173:173::/etc/abrt r:/var/empty/saslaut r/spool/post rivilege-separated SSH:/var/empt 可以看到匹配到的内容都是以r开头和以t结尾。由于grep工作在贪婪模式下,它会匹配一行中符合条件的最长内容
\{m,n\}:匹配前面的模式至少出现一次,最多出现n次。使用\去掉{}原有的意思
\{m\}:前面的模式只能出现m次
\{0,n\}:前面的模式可以没有,也可以是任意个
\{m,\}:前面的默认至少得出现m个
[[email protected] ~]# grep -o "r.\{2\}t" /etc/passwd root root root root r/ft
^:锚定行首,^后面的模式必须出现在行首
[[email protected] ~]# grep -o "^[[:alnum:]]\+" /etc/passwd root bin daemon adm lp sync shutdown halt mail ...
$:锚定行尾,$前面的模式必须出现在行尾
[[email protected] ~]# grep -o "\/[[:alnum:]]\+\/[[:alnum:]]\+$" /etc/passwd /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt /sbin/nologin /sbin/nologin /sbin/nologin
\<:和\b意思相同。锚定词首,\<后面的模式必须出现在词首。计算机中的单词是不包含特殊字符的字符串,而不是英语中的单词
[[email protected] ~]# grep "\<c" /etc/passwd vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
\>:和\b意思相同。锚定词尾,\>前面的模式必须出现在词尾
\<root\>:匹配单词root
\(\):括号,使用脱义符去掉括号本身的意思。括号内的内容可以在后面进行引用,引用符号为\1,\2... \1表示引用的是第一个括号的内容;\2表示引用第二个括号的内容。以此类推。\(\(\)\):最外侧的括号是第一个括号,里面为第二个。\(l..e\):前面匹配到什么样的内容,后面引用时就是用该内容。如果前面匹配到的是love,后面引用时就不能是like了
[[email protected] ~]# grep -o "\([[:punct:]]\+\)\1" /etc/passwd :/:/ :/:/ :/:/ :: :/:/ :: :: :: :: :: ::
2 egrep
egrep=grep -E
2.1 用法同grep
grep [OPTIONS] PATTERN [FILE...]
2.1.1 PATTERN
大体上和grep相同,最大的区别在于egrep大部分模式不再需要使用\
.:不变
[]:不变
[^]:不变
*:不变
?:无需\
+:无需\
{m,n}:无需\
{m}:刚好m次
{m,n}:最少m次,最多n次
{m,}:最少m次
{0,n}:最多n次
^:不变
$:不变
\<,\b:不变
\>,\b:不变
(),\1,\2...:无需\
abc|cba:egrep新增,abc或者cba。表示或者两侧的所有内容,不同于ab(c|b)aa. ab(c|b)aa的意思是abcaa或者abbaa
题目:
写一个模式,能匹配出所有的邮件地址
egrep "\<[a-zA-Z][[:alnum:]_]{4,16}[[:alnum:]]\>@.*\.com"