开发者学堂课程【Shell 编程入门到精通:正则表达式使用方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/453/detail/5604
正则表达式使用方法
内容介绍
一、正则表达式使用方法
二、任意字符表示
一、正则表达式使用方法
正则表达式,又称正规表示法、常规表示法(英语 Regular Expression在代码中常简写为 regex,regexp 或 RE ),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。是指一个用来描述或者匹配一系列符合某个句法规则的字符的那个字符串。用某种模式去匹配一类字符串。
使用grep来举例正则表达式,首先要说明两个参数-v和-z,如果不清楚的化可以man grep,搜索一下小写的v,可看到-invert-match不匹配或者反转匹配,另外一个-n一般显示的-line-number行号的意思,不做端口和id的转化,
1.正则表达式中特殊字符
(1 ) ^word :待搜寻的字符串(word)在行首!
搜寻"root"开始的行,准备文件passwd,grep搜索含有root的所有数据,如果只搜索开头为root的加^,例:
[root@xuegod63 tmp]# grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:”operator”:/root:/sbin/nologin
[root@xuegod63 tmp]# grep ^root passwd
root:x:0:0:root:/root:/bin/bash
(2)word$
搜索以什么结尾后跟上$,搜寻"bash"结尾的行,列出所有包含bash的可执行账号,例:
[root@xuegod63 tmp]# grep bash$ passwd
root:x:0:0: root: / root: /bin/bash
mysql:x:27 :27 :MySQL Server:/var/lib/mysql:/bin/bash
mk:x:500:500: : /home/mk: /bin/bash
…
(3) \ :将特殊符号的特殊意义去除
例:搜寻包括单引号'的行,并把行号也打印出来,单引号不可直接写,要通过转译,觉得显示看不清的化可以加-n显示行号,--color显示颜色,将有特殊意义的符号,行号标亮。
[root@xuegod63 tmp]# grep -n --color \' /tmp/ passwd
8:halt:x:7:0:
‘halt':/ sbin:/ sbin/halt
9:'mail':x:8:12:mail:/var/spool/mail:/ sbin/nologin
( 4)* :重复零个到无穷多个的前一个字符
与ls *.txt 以任意字符开头.txt 结尾不同,在正则表达式里不适用,正则表达式前总要有一个符号,正则表达式表示多个任意要在*.前面再加.,如ls .*.txt,搜寻包括sp,后面o复2次以上的行。记得要写两个o,而如果此处是 spoo*和 spo*没有太大区别,因为*表示重复零个到无穷多个前一个字符,这里只是一个巧合,平时情况推荐采用spoo*写,例:
[ root@xuegod63 tmp]# grep spoo* passwd - -color
lp:x:4:7:lp: /var/spool/ lpd: /sbin/ nologin
lp:x:4:7:lp:/var/spoxxxl/ lpd: / sbin/ no login
mail' :x:8:12:mail:/var/spool/mail :/sbin/ nologin
"uucp":x:10: 14:uucp: /var/spool/uucp: / sbin/ no login
postfix:x:89:89: :/var/spool/postfix:/ sbin/ nologin
[ root@xuegod63 tmp ]#grep spo* passwd - -color
lp:x:4:7:lp: /var/spool/ lpd:/ sbin/ nologin
lp:x:4:7:lp: /var/ spoxxxl/ lpd:/ sbin/nologin
'mail' :x:8:12 :mail: /var/spool/mail:/sbin/ nologin
"uucp"2p" :x: 10: 14:uucp:/ var/spool/uucp: / sbin/ nologin
postfix:x:89:89: :/var/spool/ postfix: /sbin/ nologin
(5) [list] :字符集合,里面列出想要选择的字符
搜寻包括ga或者go,通过g[ao]形式可以同时匹配两个条件的行,例:
[ root@xuegod63 tmp]# grep g[ao] /tmp/ passwd --color
games :X: 12: 100 :games: /us r/games: / sbin/ nologin
gopher:x: 13: 30: gopher:/var/gopher :/ sbin/nologin
(6 )搜寻以#开头和不以#号开头的行,#开头的表示注释,例:
[root@xuegod63 tmp]# grep [^ #] /tmp/ passwd
[root@xuegod63 tmp]# grep ^[^ #] /tmp/ passwd
( 7 ) [n1-n2] :字符集合的,里面列出想要包括的字符范围!
搜寻含有数字的3和4的行,并且-color 标亮3,4,和包括1-9之前的数字,例:
[root@xuegod63 tmp]# grep [3-4] passwd –color
ntp:x:38:38: :/etc/ntp: /sbin/nologin
apache:x:48:48:Apache:/var/www: /sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User: /var/lib/nfs:/sb in/nologin
…
[root@xuegod63 tmp]# grep [0-9] passwd --color
"uucp" :x:10:14: uucp: /var/spool/uucp:/sbin/nologin
operator :X:11:0: "operator" :/ root: / sbin/nologin
games :x:12 :100: games: /usr/games: / sbin/ nologin
…
2、找出开始为小写字母的
首先 grep 过滤,然后加^,以什么开头,开头里面写上范围,最后写上 passwd,输出以小写字母开头,例:
[root@xuegod63 tmp]# grep ^[a-z] passwd
nologin
tcpdump:x: 72:72::/:/sbin/ nologin
mysql:x:27 :27 :MySQL Server:/var/lib/mysql:/b
mk:x:500:500: : /home/mk: /bin/bash
…
[root@xuegod63 tmp]# grep ^[A-Z] passwd
Mk2:x:502:500::/home/mk:/bin/bash
Mk3:x:503:500::/home/mk:/bin/bash
那如果不想要开头是英文字母,由不以#开头^[^#]同理可得,^[^a-zA-Z]为不以字母开头,例:
[root@xuegod63 tmp]# grep ^[^a-zA-Z] passwd
' mail' :x:8:12:mail: /var/ spool/mail :/ sbin/nologin
"uucp" :x:10:14:uucp: /var/ spool/uucp: / sbin/nologin
#mkt:x:500:500: : /home/mk: /bin/bash
…
显示空白行及行号:
[root@xuegod63 tmp]# grep -n ^$ passwd
51:
vim 打开到51行确认是空行。
二、任意字符表示
正则表达式中,"." 代表绝对有一个任意字符的意思,可以是数字,字母等,字符长度是1;而代表重复前一个字符到无穷次的意思。任长度的字符表示方法: .*
寻找包括有r开头和t结束且长度为四个字符行, 加上–color 更便于观察,例出的不光有 root,还有r/ ft,例:
[root@xuegod63 tmp]# grep r..t passwd –color
root:x:0:0: root: /root: /bin/bash
operator :x:11:0: "operator" :/root: /sbin/nologin
ftp:x:14:50:FTP User:/var/ ftp: / sbin/nologin
…
如果非要找r开头的,加^,则只有 root 符合,例:
[root@xuegod63 tmp]# grep ^r..t passwd
root:x:0:0: root: /root: /bin/bash
寻找oo, ooo, oooo等等的数据,也就是说,至少要有两个o以上,当写oo时,出现o和oo数据,因为*表示重复零个到无穷多个前一个字符,例:
[root@xuegod63 tmp]# grep oo* passwd –color
root:x:0:0: root: /root: /bin/bash
bin:x:1:1:bin: /bin: /sbin/nologin
…
[root@xuegod63 tmp]# grep ooo* passwd –color
root:x:0:0: root:/ root: /bin/bash
lp:x:4:7: lp:/var/ spool/ lpd: /sbin/nologin
…
寻找包括g开头和g结束的字符串,中间可有可无,^g. *g passwd 则为以g开头和g结束的字符串,例:
[ root@xuegod63 tmp]# grep g. *g passwd –-color
games :x:12 :100 : games: /usr/games: /sbin/ nologin
gopher :x:13:30 : gopher: /var/gopher: /sbin/ nologin
…
[ root@xuegod63 tmp]# grep ^g. *g passwd --color
games :x:12: 100: games: /usr/games: /sbin/nologin
gopher :x:13:30: gopher: /var/gopher: /sbin/nologin
…