1、操作环境说明
这里提到的主要是在bash的suse11环境下的grep命令,以避免因系统环境的不同而导致命令执行后导致与描述的不同。
2、grep的定义和用法
grep是根据指定条件,逐行进行匹配,并将匹配内容的行显示出来的类unix工具,说白了就是用来过滤内容的,将符合过滤条件的内容,按照过滤一行显示一行的方式输出到设备上。
用法:
grep [options] PATTERN file1 …
options:常用参数,参数如下
-v 对结果取反
-i: 忽略字母大小写
-o:仅显示匹配到的字符串
-E :支持扩展正则表达式
-A n:往下多显示n行
--color:不同的颜色显示被匹配的内容
PATTERN:配置模式,通常使用正则表达式
3、shell中使用的正则表达式的分类
正则通常分为下面两类
basic regexp;基本正则表达式 ,grep默认只支持这个
extended regexp 扩展正则表达式,egrep支持,grep需要加参数-E来支持
基本正则基础:
.:匹配任意单个字符 例子:
r..t 匹配rt之间的任意两个字符的单词,如root,rcct,rdct
[]:指定范围内的任意单个字符,例子:
如[abc],匹配a或b或c
[^]:指定范围内相反的任意单个字符,例子:
如[^ab],匹配a,b之外的单个字符
[:upper:]表示所有大写字母,与[A-Z]一致
[:lower:]表示所有小写字母,与[a-z]一致
[:digit:]所有数字,与[0-9]一致
[:alpha:]所有字母,与[a-zA-Z]一致
[:alnum:]包含数字和字母,与[0-9a-zA-Z]一致
[:space:]所有空白字符,包括空格和tab键
[:punct:]所有标点符号
正常使用为[[:upper:]],而这类取反,则[^[:upper:]],表示非大写字母。
*:匹配其前面的字符任意次,包括0次的哦。例子:
如ab*c,匹配abbc,abc,abbbbc,ac,accb任意次包括0次
.*:匹配任意长度的任意字符,贪婪模式,即能匹配多长就匹配多长,最长为一行
X\{m,n\}:表示X至少出现m次,至多出现n次,比如X\{m,\},X\{0,n\}
? :匹配次数的符号,匹配前面的字符0次或1次
锚定符
^:表示行首匹配,不出现在[]内。例子:
^r..t:匹配出现在行首的r后跟任意两个字符,再加t
$:锚定行尾,例子
^$:锚定空白行
\<:锚定词首 也可以写成\b
\<r..t :匹配r出现词首的字符串(出现非字母则该单词结束)
\>:锚定词尾 也可以写成\b,然后出现的位置不同。
r..t\>
\(\):先对字符分组,然后通过\1,\2来引用第1分组,第2分组等等
4、基本例子
linux1:~ # grep "r[a-z]*t" /etc/passwd root:x:0:0:root:/root:/bin/bash lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash 上面结果与下面命令结果一致: grep "r[[:lower:]]*t" /etc/passwd
文件1内容如下
He love his lover。
She like her liker。
找出文件内容中使用单词和该单词+r的单词
linux1:/home/test # grep "\(l..e\).*\1r" 1 He love his lover. She like her liker.
5、扩展正则表达式
基本的元字符中\(\)改为()用于分组
基本的元字符中\{\}改为{}
+:次数匹配,匹配其前的字符至少一次
a|b:或者,表示a或b都行