1.什么是正则表达式?
要想管理好主机,任何一名有经验的系统管理员都会告诉你,“正则表达式很重要”。为什么重要呢?因为在日常的管理主机的过程中,
主要的就是处理文本字符,而正则表达式恰恰是处理文本所离不开的工具。
总之,正则表达式就是处理字符串的方法,以行为单位进行字符串的处理,通过一些特殊符号的辅助,可以让用户轻松的处理文本。
对于一般用户而言,使用正则表达式的机会不多,不过,要想成为一名系统管理员,正则表达式则是不可不学的。原因是,在于,系统每天产生的的信息会多到你无法想像。
由于系统的数据量太大,要系统管理员每天去看这么多信息,真的很不现实,从千百行中找出有问题的行进行处理,才是明智的做法,这个时候,就不得不用到正则表达式了。如此一来,管理员的工作将会很轻松了,当然正则表达式的用处还不至于此,深入了解后,你会爱上它的。
正则表达式分为两种,一种是基础的正则表达式,一种是扩展的正则表达式。
下面我们就介绍这两种正则表达式。
一:基础的正则表达式。
正则表达式是处理字符串的标准方式,它需要有支持的工具程序来辅助,所以,这里先介绍一个简单的命令grep。在介绍完后,再讲讲表达式的字符串处理能力。
先了解一下grep的语法。
grep [-acinv] ‘搜索字符串’ filename
参数说明:
-a :在二进制文件中,以文本方式搜索数据。
-c :计算找到‘搜索字符串’的次数。
-i :忽略大小写的不同,所以大小写视为相同。
-n :输出行号。
-v :反向选择,即显示出没有 ‘搜索字符串’的那些行显示出来。
如
#grep -v ‘root’ /var/log/secure
将/var/log/secure下的没有root的那些行显示出来
#grep ‘root’ /var/log/secure
将/var/log/secure下有root的那些行显示出来
下面来结合grep讲讲正则表达式。
grep是很常用的命令,它最重要的功能就是进行字符串的比较,然后将符合用户需要的字符串打印出来。grep在数据中查找一个字符串时是以“行”为单位进行数据的选取的。只有满足条件的行才被显示出来,不满足的就不会显示出来 。
1。搜索特定字符串
如
#grep -n ‘the’ myfile.txt
在myfile.txt 中查找 the 单词,并显示出是第几行。
#grep -vn ‘the’ myfile.txt
在myfile.txt中查找 the 单词,显示出没有the 的行,并显示出是第几行
#grep -in ‘the’ myfile.txt
不考虑the的大小写,大写和小写都是同等的,并显示出有the的行,打印出是第几行
2.利用[ ]来搜索集合字符
如果要搜索test和taste这两个单词时,可以发现,它们有共同的部分,就是‘t?st’,这个时候,我们可以这样搜索
#grep -n ‘t[ae]st’ myfile.txt
其实,,[ ]里论有几个字符,都只代表一个字符,所以,上面的例子说明了我们只需要tast或test 两个字符串
如果想要搜索有aa的字符,可以用下面方法
#grep -n ‘aa’ myfile.txt
但是如果不想aa前面有c,可以用集合字符的反向选择[^]来实现:
#grep -n ‘[^c]aa’ myfile.txt
当然[]里面还可以连写,如abc前面只能出现小写字母。
#grep -n ‘[a-z]abc’ myfile.txt
3.行首与行尾字符 ^ $
#grep -n ‘^the’ myfile.txt
查询一行字符串里有the,让the只出现在行首
#grep -n ‘the$’ myfile.txt
查询一行字符串里有the,让the只出现在行尾
还有一点就是空白行怎么表示?
如果想找出哪一行是空白行,怎么找?如下
grep -n ‘^$’ myfile.txt
刚出现就结束了,所以,空白行这样表示: ^$
4.任意一个字符(.)与重复字符(*)
. 表示拥有一个字符
假设找出开头是g,结尾是d,共有5个字符,如下
#grep -n ‘g…d’ myfile.txt
* 表示重复0个或多个前面的字符。
#grep -n ‘go*’ myfile.txt
表示o 可有可无,但g必须要有。go,goo,gd都满足此条件
记住,* 重复前面的字符,0次或多次。
有一点注意了。. 表示一个字符,*表示0个或多个字符,所有, .* 表示0个或多个任意字符。
5.限定连续重复的范围 {}
如果想限制一个范围内的重复字符数,可以用{} ,但是 {} 和 } 的符号在shell中有特殊的意义,
因此必须要使用转义字符 \ 让它推动特殊意义。
{} 的语法如下:
#grep -n ‘a\{2\}’ myfile.txt
找到两个连续的a的字符串
#grep -n ‘ga\{2,5\}g’ myfile.txt
找到以g开头,以一结尾,中间有2到5个a的字符串
#grep -n ‘ga\{2\}g’ myfile.txt
找到以g开头,以g结尾,中间有2个以上的a的字符串
综上所述,可以总结出以下的重要特殊字符。
^ 行首
$ 行尾
. 一个字符
\ 转义字符
* 重复前面的0个或多个字符
\{n,m\} 重复前面一个字符n到m次
\{n,\} 重复前面一个字符到少n次
\{n\} 重复前面一个字符n次
[] 指定范围内的一个
[^] 反向选择指定范围内的一个
二。扩展正则表达式。
事实上,一般用户只需了解基础正则表达式就足够了,不过,有时为了简化整个命令操作
,了解使用范围更广的扩展正则表达式会更方便
使用支持扩展开支正则表达式的egrep与特殊字符 | 来分隔两组字符串,会方便很多。
这里必须特别强调,grep支持基础正则表达式,而 egrep支持扩展正则表达式,熟悉了
基础正则表达式后,扩展的正则表达式只是多了几个重要的特殊的符号。如下
+ 重复一个或一个以上的字符
? 0个或一个字符
| 用或(or)的方式找出数个字符串
() 找出用户组的字符串
这就是扩展正则表达式的特殊字符。
在了解一些正则表达式后,再了解sed和awk两个工具,它们相当有用,此作为后续课程介绍。