21grep与正则表达式
1. grep简介
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
2. 正则表达式简介
首先正则表达式分为三类(man grep可以看到,分别是basic RegExs,extended RegExs,perl RegExs)
正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
3. 正则表达式的分类
1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
说明:只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法 。
4. grep 正则表达式特点
4.1 grep 支持:BREs、EREs、PREs 正则表达式
grep 指令后不跟任何参数,则表示要使用 ”BREs“
grep 指令后跟 ”-E" 参数,则表示要使用 “EREs“
grep 指令后跟 “-P" 参数,则表示要使用 “PREs"
4.2 egrep 支持:EREs、PREs 正则表达式
egrep 指令后不跟任何参数,则表示要使用 “EREs”
egrep 指令后跟 “-P" 参数,则表示要使用 “PREs"
4.3 grep 与 egrep 正则匹配文件,处理文件方法
a. grep 与 egrep 的处理对象:文本文件
b. grep 与 egrep 的处理过程:查找文本文件中是否含要查找的 “关键字”(关键字可以是正则表达式) ,如果含有要查找的 ”关健字“,那么默认返回该文本文件中包含该”关健字“的该行的内容,并在标准输出中显示出来,除非使用了“>" 重定向符号,
c. grep 与 egrep 在处理文本文件时,是按行处理的
5. grep与正则表达式使用实例
测试文本为 reg_test.tex,内容如下
[rock@192 fc_code]$ cat reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
abc
ABC
Dota
2.1 基本字符匹配
[rock@192 fc_code]$ grep '1000' reg_test.txt
JetPack 1000
rock@192 fc_code]$ grep '.000' reg_test.txt
JetPack 1000
JetPack 2000
2.2 执行 OR 匹配
[rock@192 fc_code]$ grep '1000|2000' reg_test.txt
JetPack 1000
JetPack 2000
2.3 匹配多个字符之一
#'[123]'可以看作是'[1|2|3]'的简写
[rock@192 fc_code]$ grep '[123] ton' reg_test.txt
1 ton anvil
2 ton anvil
[rock@192 fc_code]$ grep '[1|2|3] ton' reg_test.txt
1 ton anvil
2 ton anvil
#取反匹配
[rock@192 fc_code]$ grep '[^123] ton' reg_test.txt
.5 ton anvil
2.4 匹配范围
[rock@192 fc_code]$ grep '[1-5] ton' reg_test.txt
1 ton anvil
2 ton anvil
.5 ton anvil
2.5 匹配特殊字符
[rock@192 fc_code]$ grep '\.' reg_test.txt
.5 ton anvil
2.6 匹配字符类别
- \d 任意数字(等同于[0-9])
- \D 任意非数字字符 (等同于[^0-9])
- \w 任意字符或数字(等同于[a-zA-Z0-9])
- \W 任意非字母或数字字符(等同于[^a-zA-Z0-9])
- \s 任意空白字符
- \S 任意非空白字符
#基本正则表达式不支持 '\d'和'\D,Perl 的正则表达式支持
[rock@192 fc_code]$ grep '\d' reg_test.txt
[rock@192 fc_code]$ grep -P '\d' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
[rock@192 fc_code]$ grep '[0-9]' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
[rock@192 fc_code]$ grep -P '\D' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
abc
ABC
Dota
[rock@192 fc_code]$ grep '[^0-9]' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
abc
ABC
Dota
[rock@192 fc_code]$ grep '\w' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
abc
ABC
Dota
[rock@192 fc_code]$ grep '[a-zA-Z0-9]' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
abc
ABC
Dota
[rock@192 fc_code]$ grep '\W' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
[rock@192 fc_code]$ grep '[^a-zA-Z0-9]' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
[rock@192 fc_code]$ grep '\s' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
[rock@192 fc_code]$ grep '\S' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
abc
ABC
Dota
2.7 匹配多个实例
- * 0个或多个匹配
- + 1个或多个匹配(等价于{1,})
- ? 0个或一个匹配(等价于{0,1})
- {n} 具体的匹配次数
- {n,} 不少于指定的匹配次数
- {n,m} 匹配的次数范围
[rock@192 fc_code]$ grep '1*' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
abc
ABC
Dota
[rock@192 fc_code]$ grep -E '1+' reg_test.txt
JetPack 1000
1 ton anvil
TNT (1 stik)
[rock@192 fc_code]$ grep -E '1?' reg_test.txt
JetPack 1000
JetPack 2000
1 ton anvil
2 ton anvil
.5 ton anvil
TNT (1 stik)
777
abc
ABC
Dota
[rock@192 fc_code]$ grep -E '7{3}' reg_test.txt
777
[rock@192 fc_code]$ grep -P '\(\d stiks?\)' reg_test.txt
TNT (1 stik)
[rock@192 fc_code]$ grep -P '\d{4}' reg_test.txt
JetPack 1000
JetPack 2000
[rock@192 fc_code]$ grep -P '[0-9][0-9][0-9][0-9]' reg_test.txt
JetPack 1000
JetPack 2000
[rock@192 fc_code]$ grep -P '[0-9]{4}' reg_test.txt
JetPack 1000
JetPack 2000
2.8 锚
[rock@192 fc_code]$ grep '^[0-9\.]' reg_test.txt
1 ton anvil
2 ton anvil
.5 ton anvil
777
[rock@192 fc_code]$ grep '[0-9\.]$' reg_test.txt
JetPack 1000
JetPack 2000
777
[rock@192 fc_code]$ grep -P '[\d\.]$' reg_test.txt
JetPack 1000
JetPack 2000
777