作为一个新接触Linux系统的人,作为这方面的小学生,不得不说的就是正则表达式:
如果你问我什么是正则表达式,我只能回答你是搜索文件,当然如果你想听官方解释的话:
一、正则表达式的意义
正则表达式是一类字符所书写的模式,文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配的行。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常的强; 2. 可以迅速地用极简单的方式达到字符串的复杂控制。3. 对于刚接触的人来说,比较晦涩难懂。
二、正则表达式的格式及选项
(一) 基础正则表达式:grep
1.基本正则表达式的格式
# grep [options] "PATTERN" file...
如果是说正则表达式很难的话,那么这个难点应该在这个“PATTERN”上,如果想把“PATTERN”正确使用
必须把 元字符 想通透。
2.元字符
元字符:不表示字符表示的意义,用来而外功能性描述。
其实就是把一个元字符,舍弃原来的意义,变成一个变量的值,而这个变量还有固定的范围。(如果我说错了,请纠正我!)
字符匹配
.:任意单个字符,用‘ ’引起来
[ ]:指定范围内的任意单个字符
[0-9],[[:digit:]],[[:alnum:]]:匹配所有单个数字
[A-Z],[[:upper:]]:匹配所有单个大写字母
[a-z],[[:lower:]]:匹配所有单个小写字母
[[:alpha:]]:匹配所有单个字母
[[:space:]]:匹配单个空白字符
[[:punct:]]:匹配所有单个标点字符
次数匹配:用来制定其前面的字符次数
贪婪模式:尽可能最大的程度去匹配字符
*:任意次
例:x*y 那么xxy,xy,y都可以被匹配到
你可能和我犯过一样的错,为什么y能被匹配到,因为*代表的是前面那个字符出现的次数,如果*代表的是0,那么y就能被匹配到。
.*:匹配任意长度的任意字符
\?:0次或者1次
\{m\}:匹配m次
\{m,n\}:最小m次,最大n次
\{m,\}:最小m次,不限最大
\{0,n\} :最小0次,最多n次
位置锚定:用于指定字符出现的位置
^:锚定行首
$:锚定行尾
^$:空白行
\<word:锚定词首
word\>锚定词尾
\<word\>:锚定该单词
分组:转义
\(word\):如果用次数匹配前面的多个字符组成的字符串,那么该字符串必须用括号锁定
引用:
\1:后向引用,引用前面的第一个左括号以及与之相对应的左括号中的模式所匹配到的内容,且引用一次
\2:后向引用,引用前面的第一个左括号以及与之相对应的左括号中的模式所匹配到的内容,且引用二次
......依此类推
3.基本正则表达式 grep 的常用选项
-v:反向,显示不能被模式所匹配到的行
-o:仅匹配被模式的字串,而非整行
-i:不区分大小写
-E:支持扩展的正则表达式
-A+n:仅显示匹配到的行和其下面的n行
-B+n:仅显示匹配到的行和其上面的n行
-C+n:仅显示匹配到的行和其上,下面的n行
(二) 扩展正则表达式:egrep相当于 grep -E
1.扩展正则表达式的格式
# egrep [options] "PATTERN" file...
2.元字符
字符匹配
.:任意单个字符,用‘ ’引起来
[ ]:指定范围内的任意单个字符
[0-9],[[:digit:]],[[:alnum:]]:匹配所有单个数字
[A-Z],[[:upper:]]:匹配所有单个大写字母
[a-z],[[:lower:]]:匹配所有单个小写字母
[[:alpha:]]:匹配所有单个字母
[[:space:]]:匹配单个空白字符
[[:punct:]]:匹配所有单个标点字符
次数匹配:用来制定其前面的字符次数
*:匹配其前面任意字符任意次
?:匹配其前面的字符0次或者1次
+:匹配前面的字符至少1次
{m}:匹配前面的字符m次
{m,n}:匹配前面的字符,至少m次,最多n次
{m,}:匹配前面的字符,至少m次,不限最多
{0,m}:匹配前面的字符,最少0次,最多n次
位置锚定:用来指定字符出现的位置
^:锚定行首
$:锚定行尾
\<,\b:锚定词首
\>,\b:锚定词尾
分组
():分组
|:或者,只能选其一
注:fgrep:fast不解析正则表达式