首页 > 代码库 > Linux系统的grep以及正则表达式浅析!
Linux系统的grep以及正则表达式浅析!
grep命令可以从文本中或者通过管道送过来的字符流中或一个"-"符号代替文件名来搜索精确或者模糊的匹配信息,grep家族有三个命令:grep,egrep,fgrep。
grep支持正则表达式匹配查找
egrep支持扩展正则表达式匹配查找
fgrep不支持正则表达式匹配查找
grep命令的格式:
grep [OPT] ‘PATTERN‘ FILE
PATTERN是所需要匹配的内容
精确匹配中单双引号的含义相同
如果PATTERN是精确匹配(即只有普通字符不包含元字符)且字符串中间不包含空格,则引号可以省略
如果PATTERN是精确匹配但字符串中间包含空格,则必须使用引号
模糊匹配中单双引号的使用条件
如果PATTERN是模糊匹配(即包含元字符)则也必须使用引号:
如果使用单引号则PATTERN中所有字符都不能转义
如果使用双引号PATTERN中只有$ `` \ 这三个字符可以转移
OPT是grep支持的各种选项
通用信息的选项
-V 显示grep的版本信息
匹配原则的选项
-E 表示grep将支持扩展正则表达式,不再支持常规正则表达式,grep -E == egrep
匹配控制的选项
-e PATTERN 支持匹配多个字符串,每个字符串都要带-e选项来区分,多个字符串之间匹配时是或的关系
-e选项还可以用来匹配字符串中的"-",通常grep的PATTERN中出现-,grep会将其视为选项而不是字符串
例: grep -e "STRING1" -e "STRING2" ... -e "STRINGn" FILE
-f FILE 可以将需要匹配的多个字符串写入一个文件,每个匹配内容为一行,以FILE代替PATTERN,实现多个或关系的字符串匹配
例: grep -f FILE_PATTERN FILE
-i 忽略PATTERN中的大小写
-v 显示和PATTERN内不匹配的行
-w 根据PATTERN内容匹配:
精确地单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)
锚定单词首或单词尾
-x 精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配)
通用信息的选项
-c 显示匹配的行数(不会输出匹配的内容)
--color= 输出带有颜色的匹配内容(使用环境变量GREP_COLORS中预先定义好的颜色)
--color={auto|always|never} 不是很明白,有待后期继续补充
-L 在多个文件中查找匹配时,只输出不包含匹配内容的文件名
-l 在多个文件中查找匹配时,只输出包含匹配内容的文件名
-m NUM 当匹配内容的行数达到NUM行后,grep停止搜索,并输出停止前搜索到的匹配内容
-o 只输出匹配的具体字符串,匹配行中其他内容不会输出
-q 安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
-s 不会输出查找过程中出现的任何错误消息
-q和-s选项因为与其他系统的grep有兼容问题,所以不建议使用,而是使用重定向方式也可以达到相同的效果
输出信息前缀控制
-b 输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数)
-H 在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名
-h 无论查找几个文件都不会在匹配内容前输出文件名
-n 输出匹配内容的同时输出其所在行号
-T 在匹配信息和其前的附加信息之间加入tab以使格式整齐
-Z 在输出内容包含文件名的情况下,使文件名后面不再跟随其他字符(如不再跟随默认的冒号)
-A NUM 输出匹配行另加其下面的NUM行
-B NUM 输出匹配行另加其上面的NUM行
-C NUM 输出匹配行另加其上面和下面各NUM行
文件和目录的选择控制
-a 将一个二进制文件当做文本文件来处理
--binary-files=TYPE 不是很明白,有待后期继续补充
without-match 相当于-I选项
text
-D ACTION 如果Input是一个device,FIFO或socket,则需要使用ACTION来处理,默认的ACTION是read,其他还有skip 不是很明白,有待后期继续补充
-d ACTION 如果input是一个目录,将使用ACTION对其处理 不是很明白,有待后期继续补充
ACTION:
read 将目录视为普通文件来读取
skip 跳过
recurse 递归读取该目录下的所有子目录下的文件,相当于-r选项
--exclude=GLOB 搜索其文件名和GLOB通配符相匹配的文件的内容来查找匹配
使用方法:
grep -H --exclude=c* "old" ./*
c*是通配文件名的通配符
./* 指定需要先通配文件名的文件的范围,必须要给*,不然就匹配不出内容,(如果不给*,带上-r选项也可以匹配)
--include=GLOB 搜索其文件名和GLOB通配符相匹配的文件之外的其他文件的内容来查找匹配
--exclude-from=FILE 在文件中编写通配方案,grep将不会到匹配方案中文件名的文件去查找匹配内容
--exclude-dir=DIR 匹配一个目录下的很多内容同时还要让一些子目录不接受匹配,就使用此选项
grep -H -r --exclude-dir=2* "old" ./*
-I
-R -r 递归查找
其它选项
--mmap 启用mmap系统调用代替read系统调用
-U 默认grep读取windows系统文件时会通过读取文件前32K内容来猜测文件类型,如果判定是文本文件,则会去掉文本中的CR符号
-U选项否决了此种猜测方式,而是逐个的进行文件内容匹配,来判断文件类型
egrep和fgrep的格式是相同的,只不过PATTERN部分支持的正则表达式不同
正则表达式
成为regular expression,是由一系列常规字符和元字符组合而成来实现匹配
元字符:不表示字符本身的含义,而用于额外功能性描述
. 匹配任意单个字符
[] 匹配指定任意范围内的单个字符
例: [abc] 表示单个a或单个b或单个c中的一个字符
[^] 匹配指定任意范围外的单个字符
例: [^abc] 表示非a且非b且非c的单个字符
* 匹配其前的单个字符0或多次
*默认是贪婪模式,匹配的越长越好
例: eraxbuicdbdir这个字符串中我要匹配a.*b,其结果是axbuicdb而不是axb,这就是贪婪模式
? 和*类似,但是匹配其前的单个字符0或1次
\{ , \ } 精确匹配其前单个字符的次数(\是起到阻止转义的作用)
\{m,n\} 匹配至少m次,至多n次
\{m,\} 匹配至少m次
\{0,n\} 匹配至多n次
\{m\} 匹配m次
锚定符号
\<(\b) 锚定单词首部 \<WORD
\> 锚定单词尾部 WORD\>
^ 锚定行首 ^要放在PATTERN的最前面
$ 锚定行尾 $要放在PATTERN的最后面
分组与引用
\(\) 将\(STRING\)中的STRING当做一个整体来引用
\(STRING\)...\1 \1代表第一次引用前面STRING内容,一次匹配中也可以有多次分组\NUM就表示引用第NUM个分组
\ 这是阻止任何元字符转义的字符,\后面的单个字符只能表示为其字符表面含义
例:
ab\* 这个字符串是ab*,*不再代表匹配任意次其前面的字符b
扩展正则表达式
其支持的元字符和标准正则表达式稍有区别
+ 匹配+前的一个字符1次或多次
| STR1|STR2|STR3,支持以字符串为一个整体进行单个字符串的匹配
() 分组 (ab)*
引用的方法同标准正则表达式
()+ 表示多个重复的分组
{} 匹配精确次数,和标准正则表达式语法相同
需要注意: ? + | ( ) { }在扩展表达式中都不回转义,所以不需要在其前面加上\,不然会报错。
正则表达式更加详细的内容,留待后续补充!!
of which is to be matched. (-F is specified by POSIX.)
本文出自 “卫斯理初涉linux” 博客,请务必保留此出处http://rick008.blog.51cto.com/3349394/1410588