一 基本正则
1.字符匹配
.#匹配任意单个字符(除了\n),可以是一个汉字或其它国家的文字
[] #匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] #匹配指定范围外的任意单个字符,示例:[^wang] [:alnum:] #字母和数字
[:alpha:] #代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] #小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] #大写字母 [:blank:] #空白字符(空格和制表符)
[:space:] #包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包 含的范围广
[:cntrl:] #不可打印的控制字符(退格、删除、警铃...)
[:digit:] #十进制数字
[:xdigit:] #十六进制数字
[:graph:] #可打印的非空白字符
[:print:] #可打印字符
[:punct:] #标点符号
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\r\t\v], Unicode正则表达式会匹配全角空格符
\S #匹配任何非空白字符。等价于 [^\f\r\t\v]
\w #匹配一个字母,数字,下划线,汉字,其它国家文字的字符,等价于[_[:alnum:]字]
\W #匹配一个非字母,数字,下划线,汉字,其它国家文字的字符,等价于[^_[:alnum:]字]
例
echo "ab1c2d3e4444fABCg$%^" | grep "[0-Z]"
ab1c2d3e4444fABCg$%^
2 匹配次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
例:
echo "roooooooot" | grep "ro*t"
roooooooot
echo "rt" | grep "ro*t"
rt
0次或1次
root@zz:~# echo /etc/ |grep "/etc/\?"
/etc/
1次或多次
root@zz:~# echo google | grep "go\+gle"
root@zz:~# echo gooogle | grep "go\+gle"
gooogle
匹配正负数
root@zz:~# echo -1 -2 123 -123 234 |grep -E '\-?[0-9]+'
-1 -2 123 -123 234
3 位置锚定
^#行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ #空白行
\< 或 \b #词首锚定,用于单词模式的左侧
\> 或 \b #词尾锚定,用于单词模式的右侧
\ <PATTERN\> #匹配整个单词 #注意: 单词是由字母,数字,下划线组成
例
grep -v '^$\|^#' /etc/profile #排除所有空行及注释行(以#为注释)
grep "^[^#]" /etc/profile #所有非注释行
二、扩展正则
1.字符匹配
. #任意单个字符 [wang]
#指定范围的字符 [^wang]
#不在指定范围的字符
[:alnum:] #字母和数字
[:alpha:] #代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] #小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] #大写字母
[:blank:] #空白字符(空格和制表符)
[:space:] #水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] #不可打印的控制字符(退格、删除、警铃...)
[:digit:] #十进制数字
[:xdigit:] #十六进制数字
[:graph:] #可打印的非空白字符
[:print:] #可打印字符
[:punct:] #标点符号
2 匹配次数
* #匹配前面字符任意次
? #0或1次
- #1次或多次
{n} #匹配n次
{m,n} #至少m,至多n次
.3 位置锚定
^
#行首
$ #行尾
\<, \b #词首
\>, \b #词尾
4 分组其它
() 分组 #后向引用:\1, \2, ... 注意: \0 表示正则表达式匹配的所有字符
| #或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat