一、正则表达式
正则表达式模式利用元字符表示数据流中的一个或多个字符。在Linux中,常用的正则表达式有两种分别为:基本正则表达式和扩展正则表达式。
1、基本正则表达式的元字符
basic regexp:基本正则表达式中的元字符:
匹配字符:
.:匹配任意单个字符
[ ]:指定范围内的任意单个字符
[^]:对指定范围内的字符取反
匹配字符集:
[:digit:] : 数字集
[:lower:]: 小写字母
[:upper:]: 大写字母
[:space:]: 所有的空白字符
[:alpha:]: 所有的字母
[:alnum:]: 所有的字母和数字
[:punct:]: 所有的标点符号
[^[:space:]]:取反
匹配次数:
*:匹配其前面的字符任意次 ab*c: abc, abbc, ac
.*:任意长度的任意字符,贪婪模式
\?: 匹配前面的字符的0次或1次 ab?c:abc,ac
A \{m,\}: 匹配A至少m次
A\{0,n\}: 匹配A至多n次
A\{m\}:匹配Am次
锚定符:
^:锚定行首
$:锚定行尾
\<, \b 锚定词首
\>, \b 锚定词尾
分组引用 :\(\)
后向引用:\1:匹配第一个括号出现的单词
\2:匹配第二个括号出现的单词
eg:\(abc\(def\)\) \1:结果为 abcdef
\2:结果为def
正则表达式的常用元字符就是以上所述。下面综合举几个例子加以说明。
r[a-z]*t:匹配以r开头中间出现任意字符并以t结尾的字符串
r[a-z]\{1,\}t:匹配以r开头中间至少出现一个字符并以t结尾的字符串
^r..t : 出现在行首的以r开头,中间出现任意两个字符,并以t结尾的行
g$: 表示以g结尾的行
^$:空白行
\<r..t:以r开头中间出现任意两个字符并以t结尾的单词
^user[0-9]\{1,\}\>:查找当前系统上名字为user后面跟了数字的用户的相关信息
2、扩展的正则表达式
扩展的正则表达式的元字符有:
?:表示匹配前面的字符0次或1次
+:次数匹配,匹配其前的字符至少1次;
{m,}:至少匹配m次
{0,n}:至多匹配n次
{m}:刚好匹配m次
|:表示或者。(C|c)at匹配的结果为Cat,cat。
下面以解析电子邮件地址为例:
电子邮件的基本形式为:username@hostname
username的值可以使用任意字母数字,以及圆点、短划线、加号和下划线等几个特殊字符。而且这些字符可以任意形式的组合出现。 hostname部分由一个或多个域名和服务器名组成。服务器和域名也必须遵守严格的命名规则,仅允许字母数字以及圆点的字符。
从左向右设计正则表达式,用户名应该是:^([a-zA-Z0-9_\-\.\+]+)@
使用相同的方法匹配服务器名和子域名:([a-zA-Z0-9_\-\.]+)
对于顶级域名有特殊的规则。顶级域名只能是字母字符并且不能少于2个且多于5个字符。故用于顶级域名的正则表达式为:\.([a-zA-Z]{2,5})$
将它们整合到一起便可得到电子邮件的地址:
^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}$
二、grep的用法
grep是一个文本过滤工具,它可以逐行的搜索匹配条件的文本,并将匹配的行显示出来。它的匹配条件是正则表达式。
grep的基本用法为:grep [options] PATTERN file1 ...
grep的几个重要的选项有:
-v: 对结果取反
-i: 忽略字母大小写
-o: 仅显示匹配到的字符串
-E: 支持扩展正则表达式
-A n: 除匹配行外还显示匹配行的下n行
-B n: 除匹配行外还显示匹配行的上n行
-C n: 除匹配行外还显示匹配行的上下各n行
- -color:对匹配的结果以不同的颜色显示
下面通过几个例子理解grep的使用
1、显示/proc/meminfo文件中以不区分大小的s开头的行
grep --color "^[Ss]" /proc/meminfo
2、显示/etc/passwd中以nologin结尾的行;
grep --color "nologin$" /etc/passwd
3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/initta
4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
grep ":[0-9]:" /etc/inittab
5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
grep --color "^\([0-9]\).*\1$" /etc/inittab
7、取出/etc/inittab中的非空白行
grep -v "^$" /etc/initta
其实对于grep的掌握关键在于对正则表达式的理解和熟练应用。所以应多加练习正则表示式。
转载于:https://blog.51cto.com/yuan00/907850