正则表达式详解
一、概述
GREP(global search regular expression(RE) and print out the
line),是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。利用这些返回值就可进行一些自动化的文本处理工作。
二、语法格式
正则表达式: grep [option] …'pattern' file….
扩展正则表达:grep -E 'PATTERN' file….
fgrep :fast grep ,不支持使用正则表达式
语法格式上扩展正则表达式仅是比正则表达式多了一个参数 –E;
三、元字符集
1、字符匹配:
. : 匹配任意单个字符
[ ]: 匹配指定范围内的任意单个字符
[0-9] [[:digit:]]
[a-z] [[:lower:]]
[A-Z] [[:upper:]]
[[:space:]] [[:punct:]] [[:alpha:]]
[^]:取反
2、次数匹配:用于实现指定其前面的字符所能够出现的次数
*:任意长度,用于能够匹配他前面的字符可以出现任意次
\?:0次或1次,他前面的字符可有可无的
\{m\}:m次,他前面的字符出现m次
\{m,n}: 至少m次,至多n次
\{m,\}:至少m次
\{0,n\}:至多n次
.*:任意长度的任意字符,工作于贪婪模式:尽可能的去匹配
3、位置锚定
行首锚定:^ :要写在模式最左侧
行尾锚定:$: 写在模式最右侧
^$ : 空白行 实例: grep "^$" /etc/issue | wc – l
不包含特殊字符的连续字符组成的串叫单词
\<:词首,出现在单词左侧
\<char
\>:词尾, 出现于单词右侧
\>char
\b:词首词尾都行
4、分组模式
\(\):分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用;
实例:grep "\(ro\)\{1,\}" /etc/passwd 至少出现一次
引用:有编号:自左而右的左括号,以及与其匹配的右括号;从内向外;
\#:引用第n个括号所匹配到的内容,而非模式本身
四、命令选项
-v:反向选取; 如: grep –v "^$" /etc/issue
-o:仅显示匹配到的字串,而非字串所在的行 grep "r..t" /etc/passwd -o
-i : ignore-case :忽略字符大小写 Cat , cat grep -i "cat"
-E:支持使用扩展正则表达式
-A #: 被匹配到后面的#行 — grep -A 1 "r..t" /etc/passwd
-B #: 前面
-C #:前后各一行
五、正则表达式和扩展正则表达式的字符集区别
1、字符匹配基本一致
2、次数匹配
*:任意次
?: 0或1次
+:至少1次
{m}:精确匹配m次
{m , n}: m到n次
{m,} :至少m次
{0,n}:最多n次
3、锚定基本一致
4、分组
()
引用: \1,\2,\3
或者:
a |b :a或者b
conC|cat : conC或者cat
con(C|c)at : conCat或者concat
六、实例解析
1、显示/proc/meminfo文件中以大写或小写S开头的行
2、显示/etc/passwd中其默认shell为/bin/bash的用户
3、显示/boot/grub/grub.conf中以至少一个空白字符开头的行
4、添加用户,bash,testbash,basher,nologin(修改此shell为nologin)而后找出当前系统上其用户名和默认shell相同的用户
此题值得好好思考一番;
5、扩展题目:
新建一个文本文件,
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行
6、找出ifconfig命令结果中1-255之间的数字
7、挑战题:写一个模式,能匹配合理的ipv4地址
原创文章,作者:wxdz_2004(古雨秋),如若转载,请注明出处:http://www.178linux.com/4078