grep简介
grep命令用于打印满足条件的行。egrep和fgrep是grep的变体,egrep命令是扩展的grep,支持更多的正则表达式元字符,fgrep命令被称为固定的grep,正则表达式元字符不会被特殊处理,它们只匹配自己。
grep语法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
选项
选项 | 功能 |
-b | 在每一行前面加上其所在的块号,根据上下文定位磁盘块时可用到 |
-c | 显示匹配到的行的数目,而不显示行的内容 |
-h | 不显示文件名 |
-i | 比较字符时忽略大小写 |
-l | 只列出匹配行所在文件的文件名,文件名直接用换行符分割 |
-n | 在每一行前加上它所在文件中的相对行号 |
-s | 无声操作,只显示报错信息,以检查退出状态 |
-v | 反向查找,只显示不匹配的行 |
-w | 把表达式作为词来查找,就像被<和>包含一样,只用于grep |
grep使用的正则表达式元字符
元字符 | 功能 | 示例 | 匹配对象 |
^ | 行首定位符 | '^love' | 匹配所有love开头的行 |
$ | 行尾定位符 | 'love$' | 匹配所有love结尾的行 |
. | 匹配一个字符 | ‘l..e’ | 匹配包含一个l,后跟两个字符,再跟一个e的行 |
* | 匹配0个或多个前导字符 | '*love' | 匹配包含跟在0个或多个空格后的模式love的行 |
[] | 匹配一组字符中任一个 | '[Ll]ove' | 匹配Love或love的行 |
[^] | 匹配不在指定字符组内的字符 | ‘[^A-K]ove’ | 匹配包含一个不在A至K之间的字符,并且该字符后紧跟ove的行 |
< | 词首定位符 | '<love' | 匹配包含以love开头的词的行 |
> | 词尾定位符 | 'love>' | 匹配包含以love结尾的词的行 |
(...) | 标记匹配到的字符 | '(love)ing' | 标记寄存器中的一段字符,被记作1号寄存器,如果之后要引用,用1,最多可以设置9个标签,从左边开始编号,最左侧的为1号;模式love被保存在1号寄存器,之后用1引用 |
x{m}或x{m,}或x{m,n} | 字符x的重复出现的次数:m次、至少m次、至少m次但不超n次 | 'o{5}' 'o{5,}' 'o{5,10}' | 匹配连续出现5个o、至少5个o或5~10个o的行 |
grep的退出状态
- 0:匹配到模式;
- 1:找不到模式;
- 2:找不到要搜索的文件;
示例:
[root@db1 ~]# grep AleN /root/shell_stu/emp.txt
0001 AleN M 24
[root@db1 ~]# echo $?
0
[root@db1 ~]# grep AleNNN /root/shell_stu/emp.txt
[root@db1 ~]# echo $?
1
[root@db1 ~]# grep AleNNN /root/shell_stu/emp1.txt
grep: /root/shell_stu/emp1.txt: No such file or directory
[root@db1 ~]# echo $?
2
grep示例
测试数据
[root@db1 shell_stu]# cat emp.txt
0001 AleN M 24
0002 Tiboo M 32
0003 Felix M 26
0004 JacK F 24
0005 Tim M 25
0006 Audi F 30
0007 Bobo F 32
0008 Geo M 21
0009 Andy F 19
00010 Peter M 28
00011 Allen M 26
使用正则表达式的grep示例
1、打印包含Tim的行
[root@db1 shell_stu]# grep Tim emp.txt
0005 Tim M 25
2、打印Al开头,包含0个或多个l的行
[root@db1 shell_stu]# grep All* emp.txt
0001 AleN M 24
00011 Allen M 26
3、打印以0001开头的行,^是句首定位符
[root@db1 shell_stu]# grep '^0001' emp.txt
0001 AleN M 24
00010 Peter M 28
00011 Allen M 26
4、打印所有以6结尾的行,$是行尾定位符
[root@db1 shell_stu]# grep '6$' emp.txt
0003 Felix M 26
00011 Allen M 26
5、第一个参数是模式,后面都是文件
--打印包含Felix的行
[root@db1 shell_stu]# grep Felix emp.txt script.txt
emp.txt:0003 Felix M 26
script.txt:/Felix/{print "Hello "$2}
6、打印包含所有数字的行
[root@db1 shell_stu]# grep '^[0-9]' emp.txt
0001 AleN M 24
0002 Tiboo M 32
0003 Felix M 26
0004 JacK F 24
0005 Tim M 25
0006 Audi F 30
0007 Bobo F 32
0008 Geo M 21
0009 Andy F 19
00010 Peter M 28
00011 Allen M 26
7、打印包含字母的行
--打印第1个字母大写,第2、3个字母小写,第4个为空格,第5个大写的行
[root@db1 shell_stu]# grep '[A-Z][a-z][a-z] [A-Z]' emp.txt
--打印第1个字母大写,第2、3个字母小写,第4个大写的行
[root@db1 shell_stu]# grep '[A-Z][a-z][a-z][A-Z]' emp.txt
0001 AleN M 24
0004 JacK F 24
8、打印至少有4个字母连在一起的行
[root@db1 shell_stu]# grep '[a-z]{4}' emp.txt
0002 Tiboo M 32
0003 Felix M 26
00010 Peter M 28
00011 Allen M 26
9、打印所有以Audi开始的词的行,<是词首定位符
[root@db1 shell_stu]# grep '<Audi' emp.txt
0006 Audi F 30
10、打印所有以o结尾的词的行,<是词尾定位符
[root@db1 shell_stu]# grep 'o>' emp.txt
0002 Tiboo M 32
0007 Bobo F 32
0008 Geo M 21
--打印所有包含Audi词的行
[root@db1 shell_stu]# grep '<Audi>' emp.txt
0006 Audi F 30
11、打印所有以A至Z开始,以o结尾的词的行
[root@db1 shell_stu]# grep '<[A-Z].*o>' emp.txt
0002 Tiboo M 32
0007 Bobo F 32
0008 Geo M 21
使用选项的grep示例
12、打印包含字母A的行,-n列出行号
[root@db1 shell_stu]# grep -n 'A' emp.txt
1:0001 AleN M 24
6:0006 Audi F 30
9:0009 Andy F 19
11:00011 Allen M 26
13、打印包含alen的行,-i忽略大小写
[root@db1 shell_stu]# grep -i 'alen' emp.txt
0001 AleN M 24
14、打印不包含AleN的行,-v不包含
[root@db1 shell_stu]# grep -v 'AleN' emp.txt
0002 Tiboo M 32
0003 Felix M 26
0004 JacK F 24
0005 Tim M 25
0006 Audi F 30
0007 Bobo F 32
0008 Geo M 21
0009 Andy F 19
00010 Peter M 28
00011 Allen M 26
15、列出包含模式Felix的文件名,-l列出文件名,不输出文本行
[root@db1 shell_stu]# grep -l 'Felix' *
emp.txt
script.txt
16、打印模式A出现的行的次数,-c表示行的数目
[root@db1 shell_stu]# grep -c 'A' emp.txt
4
[root@db1 shell_stu]# grep 'A' emp.txt
0001 AleN M 24
0006 Audi F 30
0009 Andy F 19
00011 Allen M 26
17、打印包含词Tim的行,-w查找的是词,不是词的一部分
[root@db1 shell_stu]# grep -w 'Tim' emp.txt
0005 Tim M 25