linux正则表达式运用

    正则表达式的重要性也不用我强调了,大家都懂的。需要说明的是,正则表达式是行处理工具,它会把匹配到的内容一行一行的显示出来。正则表达式分为: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支持的模式有很多

    .:匹配任意单个字符

[root@localhost ~]# 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]表示所有字母

[root@localhost ~]# 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:]]:除了数字之外的内容

    *:匹配前面的内容任意次

        .*:任意长度的任意字符

[root@localhost ~]# grep -o "r..t" /etc/passwd
root
root
root
root
r/ft

    \:脱义符,取消后面的字符原有的意思,赋予新的意思

    \?:匹配前面的模式0次或1次,使用\重新赋予?新的含义

[root@localhost ~]# grep -o "r.\?.t" /etc/passwd
root
root
root
rat
rat
root
r/ft
rat

    \+:匹配前面的模式1次或任意次

[root@localhost ~]# 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个

[root@localhost ~]# grep -o "r.\{2\}t" /etc/passwd
root
root
root
root
r/ft

    ^:锚定行首,^后面的模式必须出现在行首

[root@localhost ~]# grep -o "^[[:alnum:]]\+" /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
...

    $:锚定行尾,$前面的模式必须出现在行尾

[root@localhost ~]# 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意思相同。锚定词首,\<后面的模式必须出现在词首。计算机中的单词是不包含特殊字符的字符串,而不是英语中的单词

[root@localhost ~]# 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了

[root@localhost ~]# 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"


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。