正则表达式,grep/egrep工具的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式,grep/egrep工具的使用相关的知识,希望对你有一定的参考价值。

正则表达式,又称规则表达式,英文名为Regular Expression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
在计算机科学中,正则表达式是这样解释的:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论是查找某个文档,抑或查询某个日志文件分析其内容,都会用到正则表达式。
其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep, sed, awk 等。


grep/egrep工具的使用

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
命令的格式为:

grep [选项] ‘word‘ filename

选项(加粗为常用选项):

-a: 不要忽略二进制数据。
-A<显示列数> :除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-B: 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c: 计算符合范本样式的列数。
-C<显示列数>或-<显示列数>: 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作>: 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式>: 指定字符串作为查找文件内容的范本样式。
-E: 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件>: 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F: 将范本样式视为固定字符串的列表。
-G: 将范本样式视为普通的表示法来使用。
-h: 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H: 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i: 忽略字符大小写的差别。
-l: 列出文件内容符合指定的范本样式的文件名称。
-L: 列出文件内容不符合指定的范本样式的文件名称。
-n: 在显示符合范本样式的那一列之前,标示出该列的编号。
-q: 不显示任何信息。
-R/-r: 此参数的效果和指定“-d recurse”参数相同。
-s: 不显示错误信息。
-v: 反转查找。
-w: 只显示全字符合的列。
-x: 只显示全列符合的列。
-y: 此参数效果跟“-i”相同。
-o:只输出文件中匹配到的部分。

实例:
1、打印出包含root的行以及这行下面的两行,并且输出行号:
技术分享图片
2、过滤不带关键词“root”的行,并输出行号:
技术分享图片
3、过滤出所有包含数字的行:
技术分享图片
4、过滤掉所有包含数字的行:
技术分享图片
5、过滤掉以#开头的行:
技术分享图片
6、过滤掉以#开头的行并且过滤掉空行:
技术分享图片
在正则表达式中, “^” 表示行的开始, “$” 表示行的结尾,那么空行则可以用 “^$” 表示。
在这个试验中,如果加上-n选项,效果会无效,这个可以自行实验!
7、打印出不以英文字母开头的行:
技术分享图片
‘[ ]’ 的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符
8、过滤出任意一个字符和重复字符:
技术分享图片
“.”表示任意一个字符,上例中,就是把符合r与o之间有两个任意字符的行过滤出来, * 表示零个或多个前面的字符。
技术分享图片

‘*‘表示零个或多个‘*‘前面的字符。
9、指定要过滤出的字符的出现次数:
技术分享图片
这里用到了{ },其内部为数字,表示前面一个字符要重复的次数。上例中表示包含有两个o 即 ‘oo’ 的行。注意,{ }左右都需要加上脱意字符 ‘\’, 另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘{n1,n2}’ 其中n1小于n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。


上面部分讲的grep,另外常常也会用到egrep这个工具,简单点讲,后者是前者的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。如果你嫌麻烦,egrep了解一下即可,因为grep的功能已经足够可以胜任你的日常工作了。下面介绍egrep不同于grep的几个用法。
1、过滤出一个或多个指定的字符:
技术分享图片
和grep 不同的是,egrep这里是使用’+’的,它表示匹配1个或多个‘+’前面的字符,不支持被grep直接使用。
egrp可以直接使用"{}",而不用加转义字符"\":
技术分享图片
2、过滤出零个或一个指定的字符:
技术分享图片
3、过滤出字符串root或者字符串1234:
技术分享图片
4、()的使用:
技术分享图片
用( )表示一个整体,例如(oo)+就表示1个 ‘oo’ 或者多个 ‘oo’。

以上是关于正则表达式,grep/egrep工具的使用的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式,grep/egrep工具的使用

Linux grep、egrep使用命令详解

linux下的grep,egrep及正则表达式

21.egrep进阶及文本处理工具应用

grep和egrep正则表达式

grep和egrep正则表达式