大家在学习正则表达式之前,首先要明确一点,并把它牢牢记在心里,那就是:
在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,不要把二者搞混了。切记!!!
通常有三种文本处理工具/命令:grep、sed、awk,它们三者均可以解释正则。下面我就为大家介绍grep命令的使用方法。
一、使用grep命令搜索文件中的内容
grep和egrep命令能够在一个或多个文件的内容中搜索某一特定的字符模式,也被称为正则表达式(regular expressions)。一个模式可以是一个单一的字符、一个字符串、一个单词或一个句子。
一个正则表达式是描述一组字符串的一个模式。正则表达式的构成是模仿了数学表达式,通过使用操作符将较小的表达式组合成一个新的表达式。一个正则表达式既可以是一些纯文本文字,也可以是用来产生模式的一些特殊字符。为了进一步定义一个搜索模式,grep命令支持以下几种正则表达式的元字符,也称通配符。
ps:正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
c*:将匹配0个或多个字符c
.:将匹配任何一个且只能是一个字符(换行符除外)
[xyz]:将匹配方括号中的任意一个字符
[^xyz]:将匹配不包括方括号中的字符的所有字符
^:锁定行的开头
$:锁定行的结尾
在基本正则表达式中,如元字符*、+、{}、|、和()已经失去了它们原来的意义,如果要回复他们原本的含义要在之前冠以反斜线\,如\*、\+等。
grep命令是用来在每一个文件中或标准输出上搜索特定的模式。当使用grep命令时,包含一个指定字符模式的每一行都会被打印在屏幕上,grep命令的语法格式如下:
grep 选项 模式 文件名
其中,选项可以改变grep命令的搜索方式,除了-w选项外,其他的每个选项都可以在egrep和fgrep命令中使用。grep命令常用选项如下:
-c(count):仅列出包含模式的行数
-i(ignore):忽略模式中字母大小写
-l(list):列出带有匹配行的文件名
-n:在匹配行的前面列出行号
-v:列出没有匹配模式的行(取反)
-w:把表达式当做一个完整的单字来搜索,忽略那些部分匹配的行
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-A n :如果匹配成功,则将匹配行及其后n行一起打印出来
-B n :如果匹配成功,则将匹配行及其前n行一起打印出来
-C n :如果匹配成功,则将匹配行及其前后n行一起打印出来
ps:如果搜索的是多个文件,grep命令的结果只显示在文件中发现匹配模式的文件名;
如果搜索的是单个文件,grep命令的结果将显示每一个包含匹配模式的行。
上面就是grep命令的基本使用方法。但是有时一个简单的正则表达式无法定位你要搜索的内容,如要搜索同时满足模式一和模式二的数据行,这时egrep命令就可以派上用场。
egrep命令的语法格式和grep命令相同。但是egrep命令是用来在一个或多个文件的内容中利用扩展的正则表达式的元字符搜索特定的模式。扩展的正则表达式的元字符包含了grep命令中使用的正则表达式元字符的同时,还增加了一些额外的元字符,大致有下面几个:
+:匹配一个或多个前导字符
a|b:匹配a或b
(RE):匹配括号中的正则表达式RE
下面我将通过一些基本的例子来增进大家对grep和egrep命令用法的了解。鉴于grep命令中所有的选项egrep都能够使用(egrep更加强大),为方便起见我将使用egrep命令为大家演示:
例一:显示出文件/etc/passwd含有root的行
例二:输出/etc/passwd中任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容
例三:显示出/etc/passwd中有多少行含有nologin
例四:显示出/etc/passwd中那些行含有root,并将行号一块输出
例五:
新建用户abominable、abominate、anomie、atomize,编写正则表达式,将他们匹配出来
例六:新建用户Alex213sb、Wpq2222b、yH438PIG、egon666、egon过滤出用户名组成是字母+数字+字母的行
例七:显示出/etc目录下所有包含root的文件名
例八:过滤掉/etc/ssh/sshd_config内所有注释和所有空行
以上例子只是很小的一部分,大家只要勤加练习,一定很快就能掌握grep命令的使用啦 ^^