《构建高可用Linux服务器 第3版》—— 3.3 基础正则表达式

3.3 基础正则表达式

首先要记住的是:正则表达式与通配符不一样,它们表示的含义并不相同!

正则表达式只是一种表示法,只要工具支持这种表示法,该工具就可以处理正则表达式的字符串。Vim、grep、Awk、Sed都支持正则表达式,也正是因为它们支持正则表达式,所以才显得很强大。我学习正则表达式的方法是先学习实例,掌握基础实例后理论基本也就到位了。所以这里我会举一些关于grep配合正则表达式的实例来说明正则表达式的强大之处。先来看看grep工具。

以前介绍过,grep工具格式如下:

grep -[acinv] '搜索内容串' filename
其中:

-a:表示以文本文件方式搜索。

-c:表示计算找到符合行的次数。

-i:表示忽略字母大小写。

-n:表示顺便输出行号。

-v:表示反向选择,即找到没有搜索字符串的行。

另外,搜索内容串可以是正则表达式。

下面举例说明。

1)搜索有the的行,并输出行号,如下所示:

#grep -n 'the' regular_express.txt```
搜索没有the的行,并输出行号,如下所示:

grep -nv 'the' regular_express.txt```

2)利用[]搜索集合字符。

[]表示其中的某一个字符,例如[ade]表示a、d或e。

#grep -n 't[ae]st' regular_express.txt

8:I can't finish the test.

9:Oh! the soup taste good!```
可以用^符号做[]内的前缀,表示除[]内的字符之外的字符。

比如,要搜索oo前没有g的字符串所在的行,就可以使用'[^g]oo'作为搜索字符串,如下所示:

grep -n '[^g]oo' regular_express.txt

2:apple is my favorite food.

3:Football game is not use feet only.```
[]内也可以用范围来表示,比如[a-z]表示26个小写字母,[0-9]表示0~9的数字,[A-Z]则表示26个大写字母。[a-zA-Z0-9]表示所有数字与英文字母。当然也可以配合^来排除字符。

搜索包含数字的行,如下所示:

#grep -n '[0-9]' regular_express.txt

5:However ,this dress is about $ 3183 dollars.

15:You are the best is menu you are the no.1.```
3)行首字符^与行尾字符$。

符号^表示行的开头,$表示行的结尾(不是字符,是位置),那么“^$”则表示空,因为只有行首和行尾。这里的符号^与[]里面所使用的^意义不同,它表示的是符号^后面的串是在行的开头。比如搜索the在开头的行,如下所示:

grep -n '^the' regular_express.txt

12:the symbol '*' is represented as star.```
4)搜索以小写字母开头的行。

命令如下所示:

#grep -n '^[a-z]' regular_express.txt

2:apple is my favorite food.

4:this dress doesn't fit me.

10:motorcycle is cheap than car.

12:the symbol '*' is represented as star.

18:google is the best tools for search keyword.

19:goooooogle yes!

20:go! go! Let's go.

woody@xiaoc:~/tmp$```
5)搜索开头不是英文字母的行。

命令如下所示:

grep -n '^[^a-zA-Z]' regular_express.txt

1:"Open Source" is a good mechanism to develop programs.

21:#I am VBird

woody@xiaoc:~/tmp$
$表示它前面的串是在行的结尾,比如,'\.$'表示点(.)在一行的结尾。

搜索末尾是点(.)的行,如下所示:

grep -n '\.$' regular_express.txt ```

点(.)是正则表达式的特殊符号,所以要用\转义,结果如下所示:

1:"Open Source" is a good mechanism to develop programs.

2:apple is my favorite food.

3:Football game is not use feet only.

4:this dress doesn't fit me.

5:However ,this dress is about $ 3183 dollars.

6:GNU is free air not free beer.

...
6)注意在MS系统下生成的文本文件,换行时会加上一个^M字符,所以最后的字符会是隐藏的^M,在处理Windows下面的文本时要特别注意!

可以用cat dos_filetr-d'\r'>unix_file来删除^M字符。那么'^$'就表示只有行首、行尾的空行了!

搜索空行的命令如下所示:

#grep -n '^$' regular_express.txt

22:

23:

woody@xiaoc:~/tmp$```
7)搜索非空行的命令如下所示:

grep -vn '^$' regular_express.txt

1:"Open Source" is a good mechanism to develop programs.

2:apple is my favorite food.

3:Football game is not use feet only.

4:this dress doesn't fit me.

8)正则中的重复字符*与任意一个字符点(.)。

在bash中代表通配符,用来表示任意个字符,但是在正则表达式中,其含义则不同,表示有0个或多个某字符,请注意区分。

例如,oo*表示第一个o一定存在,第二个o可以有一个或多个,也可以没有,因此代表至少一个o,点(.)代表一个任意字符,必须存在。

在下面的例子中,g??d可以用'g..d'表示,good、gxxd、gabd……都符合g??d。

grep -n 'g..d' regular_express.txt

1:"Open Source" is a good mechanism to develop programs.

9:Oh! the soup taste good!

16:The world is the same with 'glad'.

woody@xiaoc:~/tmp$
搜索有两个o以上的字符串,如下所示:

grep -n 'ooo*' regular_express.txt 

1:"Open Source" is a good mechanism to develop programs.

2:apple is my favorite food.

3:Football game is not use feet only.

9:Oh! the soup taste good!

18:google is the best tools for search keyword.

19:goooooogle yes!
grep -n'ooo*'regular_express.txt表示前两个o一定存在,第三个o可没有,也可有多个。

搜索以g开头和结尾,中间是至少一个o的字符串,即gog、goog、gooog等,如下所示:

grep -n 'goo*g' regular_express.txt

18:google is the best tools for search keyword.

19:goooooogle yes!```
9)限定连续重复字符的范围时使用{}。

符号.*只能限制0个或多个字符,如果要确切地限制字符的重复数量,就要用{范围}这种方式。范围是数字,用逗号(,)隔开。比如,“2,5”表示2~5个,“2”表示2个,“2,”表示2到更多个。

注意 由于{}在Shell中有特殊意义,因此作为正则表达式用的时候要用\转义一下。

搜索包含两个o的字符串的行,如下所示:

#grep -n 'o\{2\}' regular_express.txt

1:"Open Source" is a good mechanism to develop programs.

2:apple is my favorite food.

3:Football game is not use feet only.

9:Oh! the soup taste good!

18:google is the best tools for search keyword.

19:goooooogle yes!```
搜索g后面跟2~5个o,再跟一个g的字符串的行,如下所示:

grep -n 'go\{2,5\}g' regular_express.txt

18:google is the best tools for search keyword.```
搜索包含g,且后面跟两个以上的o,再跟g的行,如下所示:

#grep -n 'go\{2,\}g' regular_express.txt

18:google is the best tools for search keyword.

19:goooooogle yes!```
10)注意,[]中的符号^表示否定的意思,也可以把它放在[]中内容的后面。

'[^a-z\.!^-]'表示没有小写字母,没有点(.),没有感叹号(!),没有空格,没有-的串,注意[]里面有个小空格。另外Shell里面的反向选择为[!range],而在正则表达式里则是[^range],希望大家也注意区分一下。

11)扩展正则表达式egrep。

扩展正则表达式是在基础正则表达式上添加了几个特殊符号构成的,它令某些操作更加方便。

比如,我们要去除空白行和行首为#的行,会这样用:

grep -v '^$' regular_express.txt | grep -v '^#'

"Open Source" is a good mechanism to develop programs.

apple is my favorite food.

Football game is not use feet only.

this dress doesn't fit me.```
然而使用支持扩展正则表达式的egrep与扩展特殊符号,则会方便许多。

注意 grep只支持基础表达式,而egrep支持扩展,其实egrep是grep -E的别名,因此grep -E支持扩展正则表达式。

用法如下所示:

#egrep -v '^$|^#' regular_express.txt

"Open Source" is a good mechanism to develop programs.

apple is my favorite food.

Football game is not use feet only.

this dress doesn't fit me.```
这里的符号表示或的关系。即满足^$或^#的字符串。

注意 egrep也很好用,我在写一个Shell脚本时就正好用到了这个。有时候,并不是只grep -v一个对象,像egrep -v"192.168.1.101102104"这种用法就很适合egrep。

这里列出几个扩展特殊符号:

+:与符号.*的作用类似,表示一个或多个重复字符。

?:与符号.*的作用类似,表示0个或一个字符。

:表示或的关系,比如'gdgooddog'表示有gd、good或dog的字符串。

():将部分内容合成一个单元组。比如,要搜索glad或good,可以采用'g(laoo)d'这种方式。()的好处是可以对小组使用+?*等。

比如,要搜索以A和C开头结尾,中间至少有一个(xyz)的字符串,可以这样用:'A(xyz)+C'。
时间: 2024-12-03 21:35:47

《构建高可用Linux服务器 第3版》—— 3.3 基础正则表达式的相关文章

《构建高可用Linux服务器 第3版》—— 导读

前言 我的系统架构师之路 2004年我初识UNIX开源系统.那会儿我正在一家大型国有企业做系统管理员,负责值守公司的Windows Server 2000服务器.当时"震荡波"和"冲击波"这两种病毒很猖狂,虽然我们在防毒方面投入了大量的精力和金钱(当时购买的都是正版Windows 2000系统和正版瑞星杀毒软件),但新上线的机器,偶尔也有遗漏的时候,没有打补丁的机器无一幸免,所以对这个问题比较头疼.有一次去朋友的公司(某省太平洋寿险下面的一个分支机构)参观,我发现他

《构建高可用Linux服务器 第3版》—— 第1章 Linux服务器的构建基础

第1章 Linux服务器的构建基础 在从事目前的系统架构师工作之前,很长一段时间我从事的是系统管理员/高级系统管理员工作.在企业日常运营中,我的工作涉及的内容主要有电子商务网站的运维.内网开发环境的部署.公司外包项目的实施等.在这些工作中,我用到的系统绝大多数是免费开源的CentOS 5.8 x86_64系统,它的稳定和高效令我印象深刻.本章将以CentOS 5.8 x86_64的生产服务器为平台,逐步介绍它的Kickstart无人值守安装.网络配置.日志分析.性能状态监控,以及它的最小化优化等

《构建高可用Linux服务器 第3版》—— 1.5 Linux服务器的优化

1.5 Linux服务器的优化 服务器的优化是我们最小化安装系统时应该做的事情.其实,在做这项工作之前,我们就应该根据实际应用需求来选购Linux服务器,然后有所偏重地选择硬件,比如我们应该根据服务器的应用来确定是需要RAID 5,还是单块硬盘等. 1.5.1 如何根据服务器应用来选购服务器 无论是租用还是托管都要面临一个问题,那就是选择服务器的硬件配置,前面也说了,选购硬件配置时要根据我们的服务器应用需求而定.因为你无法通过一台服务器来满足所有的需求,解决所有的问题.在项目实施或网站架构之前,

《构建高可用Linux服务器 第3版》—— 1.6 用开源工具Nagios监控Linux服务器

1.6 用开源工具Nagios监控Linux服务器 1.6.1 CentOS 5.8下的监控工具 在开源系统CentOS 5.8下有许多监控工具,比如实时监控系统状态的Nagios,还有监控网络流量的Cacti和MRTG,以及我个人比较喜欢的NTOP和Iptraf:另外,在CentOS 5.8下也有许多强大的命令行可用于监控系统状态,大家可以在Google上搜索以了解其具体用法. 1.6.2 Nagios应该监控的服务器基础选项 经过工作实践,我们认为Nagios应该监控服务器的参数有如下几个方

《构建高可用Linux服务器 第3版》—— 第3章 生产环境下的Shell脚本

第3章 生产环境下的Shell脚本 虽然Shell脚本只是一个简单的解释型语言,不会受到开发人员的重视,但对于我们系统管理员来说它有着举足轻重的作用,它可以帮助我们简化日常的工作并减少工作量,成为系统管理员的瑞士军刀.我们在系统维护工作中用Shell脚本常常能比用C语言编写的程序更快地解决相同的问题.此外,Shell脚本具有很好的可移植性,有时跨越UNIX与POSIX兼容的系统,仅需略作修改,甚至不必修改即可使用Shell脚本. 在日常工作中Shell脚本能帮助我们做什么呢? 1)配合Cront

《构建高可用Linux服务器 第3版》—— 1.4 Linux服务器的日志管理

1.4 Linux服务器的日志管理 从安全的角度来说,Linux服务器的日志非常重要,它记录了系统每天所发生的各种各样的事情,如果服务器受到攻击,就可以根据它来进行分析.同时,它更是很重要的排障依据,可以通过它来检查错误发生的原因,所以我们必须了解和熟悉其运作机制. 1.4.1 系统日志syslog.conf的配置详解 目前,Linux依旧使用syslog作为日志监控进程,对其进行必要的配置能减少很多麻烦,并且可更有效地从系统日志监控到系统的状态.理解并完善一个syslog的配置,对于系统管理员

《构建高可用Linux服务器 第3版》—— 1.7 小结

1.7 小结 本章以CentOS 5.8 x86_64下的Kickstart无人值守安装.网络配置.日志分析.性能及状态监控.优化等方面对Linux系统进行了全方位说明,这些都是构建高性能及高可用的Linux系统的基础,希望大家能够掌握此章内容.理解了本章内容,我们以后的工作会更加得心应手.

《构建高可用Linux服务器 第3版》—— 1.2 全面了解Linux服务器

1.3 Linux服务器的网络配置 Linux服务器的系统安装好后,就要在机房或公司内网环境中配置它的IP了,这是最重要的一个环节,下面我就以CentOS 5.8 x86_64服务器为例来说明如何通过命令或图形来配置Linux服务器的IP.网关.DNS,以及如何用命令查看Linux的进程或网络连接等. 1.3.1 配置Linux服务器的网络 1.手动修改配置网卡文件 手动配置网卡是最直接的方式,熟练的系统管理员在平时维护系统的时候更喜欢使用这种方式,因为手工配置有很多优点: 熟悉命令之后,手工配

《构建高可用Linux服务器 第3版》—— 2.7 系统维护时应注意的非技术因素

2.7 系统维护时应注意的非技术因素 我们在平时进行系统维护时,除了技术方面的因素外,还要注意一些非技术的因素,因为它们也是安全隐患,如果大意,极有可能影响网站运行,我特地归纳了几点,如下所示: 在机房巡视时,我发现很多的管理员特别喜欢用root进行维护,并且不logout就直接走人了,这种做法是极其危险的.因为如果机房的机器多,会涉及几个部门的System Admin,极容易出现误操作的情况,所以正确的做法应该是操作完成后应立即用CTRL+D快捷键退出,然后锁上机房门.另外,我建议重要的服务器

《构建高可用Linux服务器 第3版》—— 3.6 生产环境下的Shell脚本分类

3.6 生产环境下的Shell脚本分类 生产环境下的Shell脚本作用还是挺多的,这里根据3.1节所介绍的日常工作中Shell脚本的作用,将生产环境下的Shell脚本分为备份类.监控类.统计类.开发类和自动化类.前面3类从字面意义上看比较容易理解,后面的我稍微解释一下:开发类脚本是用Shell来配合PHP做一些非系统类的管理工作,比如SVN的发布程序等:而自动化类脚本则利用Shell自动来替我们做一些繁琐的工作,比如自动生成及分配密码给开发组的用户或自动安装LNMP环境等.下面我会就这些分类举一