一、正则表达式(grep):
1.1 基本概念:
grep: (global search regular expression(RE) and print out the line,即全面搜索正则表达式并把行显示出来,正则表达式是一种强大的文本搜索工具,能够根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行。
1.2 语法规则:
通过man命令可以看到grep命令的语法规则:
1.3 grep中的常用选项:
例如:过滤出/etc/passwd文件中含有root的字符并显示出其颜色:
(2)-v: 反向,显示不能被模式所匹配到的行。
例如:显示出/etc/passwd文件中不是以“/sbin/nologin”结尾的行:
(3)-o: 仅显示被模式匹配到的字串,而非整行。
例如:只显示出/etc/passwd文件中含有root的字符:
(4)-i: 不区分字符大小写,即ignore-case。
例如:显示/etc/passwd下以大小写s开头的行:
(5)-E: 支持扩展的正则表达式,通常grep命令后面加-E选项,就成为扩展的正则表达式。
例如:过滤出/proc/meminfo下面含有“SwapFree”的字段:
(6)-A #:“#”代表数字,显示被模式匹配到的行以及后面的#行。
例如:显示出/etc/shadow中含有root字段的行以及该行的下面一行:
(7)-B #:“#”代表数字,显示被模式匹配到的行以及前面的#行。
例如:显示出/etc/issue中含有http字段的行以及该行前面的3行:
(8) -C #:“#”代表数字,显示被模式匹配到的行以及该行的前后#行。
显示出/boot/grub/grub.conf中以“#boot”开头的行以及该行的前后2行:
1.4 grep是一类字符所书写出的模式(pattern),模式中的元字符不表示字符本身的意义,只是用于额外功能性的描述,下面介绍元字符的用法:
(1).: 代表匹配任意单个字符。
例如:显示出/etc/passwd中以“r”开头,以“t”结尾,中间跟了任意2个字符的字符串的行:
注意:模式中一旦有字符,就必须用引号引上,模式中如果做了变量引用的话就必须用双引号引上,其他情况单引号和双引号都行,例如:
说明:上面的图例中,先声明的变量city的值为beijing,然后对citys这个文件中含有$city的行进行过滤,$city加了双引号后表示引用的变量city的值,如果$city加了单引号就表示显示出$city这个字符串。
(2)[0-9]或[[:digit:]]:表示匹配0到9之间的任意一个数字。
例如:显示出/etc/passwd中以5开头,而后跟着任意一个数字,最后以任意字符结尾的字符串的行:
(3)[a-z]或[[:lower:]]:表示匹配任意一个小写字母。
例如:显示出/etc/shadow中以r开头,然后跟着任意一个小写字母的字符串的行:
(4)[A-Z]或[[:upper:]]:表示匹配任意一个大写字母。
例如:显示出/etc/passwd中以P开头,然后跟着任意一个大写字母的字符串的行:
(5)[[:alpha:]]:表示匹配任意一个大小字母。
例如:显示出/etc/issue中以任意一个大小字母开头以s结尾的字符串的行:
(6)[[:alnum:]]:表示匹配任意一个大写字母或小写字母或数字。
例如:显示出/etc/passwd中以x开头,然后跟着任意一个大小写字母或数字的字符串的行:
(7)[[:space:]]:表示匹配一个空格。
例如:显示出/etc/issue中以一个空格开头,然后跟着任意一个数字的字符串的行:
(8)[[:punct:]]:表示匹配一个任意一个标点符号。
例如:显示出/etc/issue中以一个空格开头,然后跟着任意一个标点符号的字符的行:
(9)[^]:表示指定范围外的任意单个字符。
例如:显示出/etc/init.d/atd中以#开头的行,并且#后面跟着一个非空字符:
(10)$:表示以某某结尾的行。
例如:显示/etc/issue中以m结尾的行:
(11)*: 表示匹配前面的一个字符出现任意次。
例如:x*y就代表x可以出现0次或0次以上,如下图:
(12)\?: 表示匹配前面的字符只能出现0次或1次。
例如:x\?y表示x只能出现0次或一次:
说明:字符匹配工作在贪婪模式,它会尽可能长的去匹配字符。
(14).*:表示任意长度的任意字符。
例如:显示出/etc/passwd中以r开头,中间跟了任意长度的任意字符,以2到5之间任意一个数字结尾的字符串的行:
(13)\{m\}: 表示前面的字符可以出现m次。
例如:显示出/etc/issue中http只能出现一次的行:
(14)\{m,\}: 表示其前面的字符至少出现m次。
例如:显示出/etc/passwd中root至少出现一次的行:
(15)\{0,n\}:表示其前面的字符至多出现n次。
例如:显示出/etc/shadow中sshd最多出现1次:
(16)\{m,n\}:表示前面的字符最少出现m次,最多出现n次:
例如:
(17)^: 锚定行首。
例如:过滤出/etc/passwd中以大小写r开头,以大小写t结束,中间跟着0个以上非标点符号的行:
(18)$:锚定行尾。
例如:显示出/etc/passwd中以bash结尾的行:
说明:^和$都属于位置锚定,用于指定字符出现的位置。
(19)^$:表示空白行。
例如:统计出/etc/rc.d/rc.sysinit中的空白行的行数:
(20)\<char或\bchar: 锚定词首。(char表示由任意字符组成的单词)
例如:显示出/etc/passwd中单词root:
(21)char\>或char\b: 锚定词尾。
例如:显示出/etc/passwd中单词home:
(22)\(\):分组,匹配小括号中的多个字符。
例如:显示出/etc/passwd中以rt开始,然后后面跟着任意一个字符的行:
(23)\1,\2,\3,...\n:分组引用,表示引用前面第一个、第二个、第三个到第n个括号的字符串。
1.5 grep实例:
(1)显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行:
(2)找出/etc/passwd文件中一位数或两位数:
(3)写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254):
二、扩展的正则表达式(egrep):
1.1 基本概念:使用扩展正则表达来构建模式,相当于grep -E,为grep的扩充版本,改良了许多传统grep不能或不便的操作。egrep命令是一个搜索文件获得模式,使用该命令可以任意搜索文件中的字符串和符号,也可以为你搜索一个多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字、一个句子。
1.2 egrep的模式中匹配的元字符:
(1)字符匹配:
.: 任意单个字符
[]: 指定范围内的任意单个字符
[^]: 指定范围外的任意单个字符
(2)次数匹配:
*:匹配其前面的字符任意次;
?: 匹配其前面的字符0或1次;
+: 匹配其前面的字符至少1次
{m}: 匹配其前面的字符m次;
{m,n}: 至少m次,至多n次
{m,}: 至少m次;
{0,n}:至多n次;
(3)锚定:
^: 锚定行首
$: 锚定行尾
\<,\b: 锚定词首
\>,\b:锚定词尾
(4)分组:
(): 分组
|: 或者,在做或者处理的时候只能使用扩展的正则表达式。 例如: abc|bcd :表示 匹配字符串“abc”或字符串“bcd”。
1.3 egrep的实例(由于egrep与grep的命令基本相同,在此只做部分举例):
(1)找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHED”结尾的行:
(2)找出ifconfig命令结果中的1到255之间的整数:
(3)显示/boot/grub/grub.conf中以至少一个空白字符开头的行:
三、对grep和egrep的结论:
grep和egrep是很常见也很常用的命令,它最重要的功能就是进行字符串数据的比较,然后将符合用户需求的字符串显示出来,由于vi、grep、awk、sed等工具都支持正则表达式,对于文本中的字符串的处理相当的方便,所以学好正则表达式对于linux中的文本操作就方便多了。