【Shell】Shell编程之grep命令

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



原文地址:https://www.cnblogs.com/alen-liu-sz/p/12975669.html