Linux中正则表达式简单使用
正则表达式就是由一系列特殊字符组成的字符串,其中每个特殊字符都被称为元字符。这些元字符并不表示为它们字面上的含义,而会被解释为一些特定的含义。
一个正则表达式会包含下列一项或多项:
(1)一个字符集。这里所指的字符集只包含普通字符,这些字符只表示它们的字面含义。正则表达式的最简单形式就是只包含字符集,而不包含元字符。
(2)锚。锚指定了正则表达式所要匹配的文本在文本行中所处的位置。 5个锚定符:
行首锚定:^
行尾锚定:$
词首锚定:\<字符
词尾锚定:字符\>
单词锚定:\<字符\>
(3)修饰符。它们扩大或缩小(修改)了正则表达式匹配文本的范围,修饰符包含星号,括号和反斜杠。
① 点 -- .-- 用于匹配任意一个字符,除了换行符。
② 星号 -- *-- 用来匹配它前面字符的任意多次,包括0次。
③ 脱字符号 -- ^-- 匹配行首,但是某些时候需要依赖上下文环境,在RE中,有时候也表示对一个字符集取反。
④ 美元符 -- $-- 在RE中用来匹配行尾。
"XXX$" 匹配行尾的XXX
"^$" 匹配空行
⑤ 中括号 -- [...]-- 在RE中,将匹配中括号字符集中的某一个字符。
"[xyz]" 将会匹配字符x,y或z
"[c-n]" 匹配字符c到字符n之间的任意一个字符
"[B-Pk-y]" 匹配从B到P或从k到y之间的任意一个字符
"[a-z0-9]" 匹配任意一个小写字母或数字
"[^b-d]" 将会匹配范围在b到d之外的任意一个字符,这就是使用^对字符集取反的一个例子。
可以将多个中括号字符集组合使用,能够匹配一般的单词或数字。"[Yy][Ee][Ss]" 能够匹配yes,Yes,YES,yEs等。
⑥ 反斜杠 -- \-- 用来转义某个特殊含义的字符,这意味着这个特殊字符将会被解释为字面含义。
⑦ 转义的"尖括号"-- \<...\>-- 用于匹配单词边界。尖括号必须被转义才含有特殊的含义,否则它就表示尖括号的字面含义。"\<the\>"完整匹配单词"the",不会匹配"them","there","other"等等。
⑧ 转义小括号表示分组,转义大括号表范围。基本正则没有竖线|
⑨ 转义"大括号"-- \{ \}-- 在转义后的大括号中加上一个数字,这个数字就是它前面的RE所能匹配的次数。"[0-9]\{5\}"精确匹配5个数字。
例子:
(1)新建文件f1,内容为:
(第一行为空)
123
a123
aa123
# grep 'a*' f1
a*表示a字符出现了0次或多次
(2)# ll | grep '^-' (列出当前目录下的普通文件)
# ll | grep '^d'(列出当前目录下的所有目录)
(3)grep 'bash$' --color=auto /etc/passwd
root:x:0:0:root:/root:/bin/bash u1:x:500:500::/home/u1:/bin/bash rootabc:x:501:501::/home/rootabc:/bin/bash
(4)# grep 'r..t' --color=auto /etc/passwd
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
rootabc:x:501:501::/home/rootabc:/bin/bash
(5)# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash rootabc:x:501:501::/home/rootabc:/bin/bash
(6)# grep '^root\>' /etc/passwd(词尾锚定)
root:x:0:0:root:/root:/bin/bash
(7)去掉空白行
# grep -v '^#' /etc/squid/squid.conf | grep -v '^$' (-v表示取反,'^$'表示空白行)
(8)# grep '[a-z]' f1 (搜索某一行包含有字母的)
(9)# grep '[0-9]' f1 (搜索某一行包含有数字的)
(10)# grep '[[:digit:]]' f1 (搜索某一行包含有字母的,遵循POSIX规范的写法)
(11)# grep '[[:alpha:]]' f1
取范围-- { },要转义-- \{ \},这是标准正则表达式支持的。
# grep 'o\{2\}' --color=auto /etc/passwd (\{2\}表示字母o至少出现2次)
# grep 'o\{1,2\}' --color=auto /etc/passwd (\{1,2\}表示字母o出现1次或以上)
例如:我们要匹配一个手机号码。
1. 分析字符串特点,手机号码是数字,并且是以1开头,11位长
2.可以写”1\d” 1开头,后面跟着数字,也可以是:1[0-9]
3.数字长度是11位 ,继续补充1\d{10} ,后面数字长11字符,也可以是:1[0-9]{10} ;{}里面数字,表示它左边字符可以重复出现次数
4.所有字符必须是11位,因此头尾直接必须满足条件,因此可以是:^1\d{10}$ 了。
例如:我们匹配QQ号码
1.分析QQ号码特点是,号码最少是5位数,首位字符非0,最大长度,目前到11位了
2.可以先定义首位字符,[1-9]\d 首位字符是1到9,后面是字符
3.后面字符个数在4到10位 [1-9]\d{4,10}
4.所有字符串必须都满足上面匹配,因为可以写成:^[1-9]\d{4,10}
浙公网安备 33010602011771号