一.grep简介
grep 全程Globally search a Regular Expression and Print,是一种强大的文本搜索工具,它能使用特 定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep和egrep
二.grep的工作模式
1.grep执行语法
cpp
grep [option] file...
2.工作方式
- grep在一个或者多个文件中搜索字符串模板
- 如果模板中包括空格,需要使用引号引起来
- 模板后的所有字符串会被看作是文件名
3.工作结果
- 如果模板搜索成功,则返回0状态码
- 如果搜索不成功,则返回1状态码
- 如果搜索的文件不存在,则返回2的状态码
三.grep的常用参数详解
1.常用参数详解
|----|------------------------------------------|
| 选项 | 说明 |
| -i | 忽略大小写 |
| -e | 实现多个选项间的逻辑或关系 |
| -E | 如果pattern是扩展正则表达式,需要使用-E选项,grep -E=egrep |
| -n | 显示行号 |
| -w | 按照单词匹配 |
| -o | 只显示匹配到的内容 |
| -v | 不显示匹配到的行 |
| -c | 统计匹配的行数 |
cpp
[root@node mnt]# vim sen
[root@node mnt]# grep root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:chroot:test
test:test:root
[root@node mnt]# grep -i root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:ROOT:test
test:chroot:test
test:test:root
[root@node mnt]# grep root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:chroot:test
test:test:root
[root@node mnt]# grep root bash sen
grep: bash: No such file or directory
sen:root:x:0:0:root:/root:/bin/bash
sen:operator:x:11:0:operator:/root:/sbin/nologin
sen:test:root:test
sen:test:chroot:test
sen:test:test:root
[root@node mnt]# grep -e root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:chroot:test
test:test:root
[root@node mnt]# grep lp sen
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@node mnt]# grep -n lp sen
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@node mnt]# grep -A2 lp sen
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@node mnt]# grep -B2 lp sen
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@node mnt]# grep -w root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:test:root
[root@node mnt]# grep -o root sen
root
root
root
root
root
root
root
[root@node mnt]# grep root sen -v
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
test:ROOT:test
[root@node mnt]# grep root sen -c
5
四.正则表达式的使用
1.什么是正则表达式
正则表达式就是用在字符串的处理上面的一项表示式
在我们做程序设计时很多需要对一类字符进行处理,正则表达式就完美的解决了这个问题
2.正则表达式
基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达 式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一, 另外一种语法标准称为扩展正则表达式
扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符
|-------------------------|-------|----------------------------------------|
| 元字符 | 表达式类型 | 说明 |
| ^ | 基本正则 | 以某个字符开头 |
| $ | 基本正则 | 以某个字符结尾 |
| . | 基本正则 | 匹配任意单字符 |
| * | 基本正则 | 字符出现0到任意次 |
| ? | 基本正则 | 字符出现0到1此 |
| + | 基本正则 | 字符出现1到任意次 |
| {m,n} | 基本正则 | 将前一项字符重复m-n次,{m,},{,n},{m} |
| [] | 基本正则 | 对方括号内的单字符进行匹配 |
| [^] | 基本正则 | 不匹配方括号内的单字符 |
| ^[] | 基本正则 | 匹配以某个字符开头的行 |
| \ | 基本正则 | 转义字符,让一些特殊符号失效 |
| () | 基本正则 | 定义一个子表达式 |
| (str1 | str2) | 基本正则 | 匹配str1 或str2 |
| 词首【或\b】和词尾锚定 【>或者\b】 | 基本正则 | 其后面的任意字符必须作为单词首部出现;其前面的 任意字符必须作为单词尾部出现 |
Note
在grep命令使用基本正则表达式时不需要加任何参数
在grep命令使用扩展正则表达式时必须加-E参数
示例:
a.过滤以root开头的行,过滤以root开头bash结尾的行
cpp
[root@node shell]# grep ^root testfile
root:x:0:0:root:/root:/bin/bash
[root@node shell]# grep -E "(^root|bash$)" testfile
root:x:0:0:root:/root:/bin/bash
b.过滤以root结尾的行
cpp
[root@node shell]# grep root$ testfile
test:test:root
c.搜索e开头y结尾的三字符单词,搜索e开头y结尾的四字符单词
cpp
[root@node shell]# vim testfile1
eay
eby
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy
[root@node shell]# grep e.y testfile1
eay
eby
[root@node shell]# grep e..y testfile1
eaay
ebby
eaby
d.搜索e开头Y结尾的所有行
cpp
[root@node shell]# grep e.*y testfile1
eay
eby
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy
e.搜索自定次数出现的字符
cpp
[root@node shell]# grep -E "e.{2}y" testfile1
eaay
ebby
eaby
[root@node shell]# grep -E "e.{,2}y" testfile1
eay
eby
eaay
ebby
eaby
[root@node shell]# grep -E "e.{2,}y" testfile1
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy
[root@node shell]# grep -E "e.{2,3}y" testfile1
eaay
ebby
eaaay
ebbby
eaby
[root@node shell]# grep -E "e.?y" testfile1
eay
eby
[root@node shell]# grep -E "e.+y" testfile1
eay
eby
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy
[root@node shell]# grep -E "e[^ac]?y" testfile1
eby
[root@node shell]# grep -E "e[ac]?y" testfile1
eay
[root@node shell]# grep -E "e(ab)?y" testfile1
eaby
3.正则表达式字符集
|------------------|---------------------------------------------------------------|
| 字符 | 说明 |
| [[:alpha:]] | 匹配任意一个字母,等价于 [A-Za-z] |
| [[:alnum:]] | 匹配任意一个字母或者数字,等价于 [A-Za-z0-9] |
| [[:digit:]] | 匹配任意一个数字,等价于 0-9 |
| [[:lower:]] | 匹配任意一个小写字母,等价于 a-z |
| [[:upper:]] | 匹配任意一个大写字母,等价于 A-Z |
| [[:space:]] | 匹配任意一个空白符,包括空格、制表符、换行符以及分页符 |
| [[:blank:]] | 匹配空格和制表符 |
| [[:graph:]] | 匹配任意一个看得见的可打印字符,不包括空白字符 |
| [[:print:]] | 匹配任何一个可以打印的字符,包括空白字符,但是不包括控制字符、字符串结束 符'\0' 、 EOF 文件结束符( -1 ) |
| [[:cntrl:]] | 匹配任何一个控制字符,即 ASCII 字符集中的前 32 个字符。例如换行符、制表符等 |
| [[:punct:]] | 匹配任何一个标点符号,例如 "[]" 、 " {}"或者 "," 等 |
| [[:xdigit:]] | 匹配十六进制数字,即 0-9 、 a-f 以及 A-F |
Note
通配符和正则表达式比较
1.通配符和正则表达式看起来有点像,不能混淆,可以简单的理解为通配符只有\*,?,[],{}这4种,而正 则表达式复杂多了
2.在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表 达式中他是重复之前的一个或者多个字符,不能独立使用的。