grep 用法
来源:互联网 发布:布尔玛和孙悟空 知乎 编辑:程序博客网 时间:2024/06/05 23:01
rep用于输出匹配指定正则表达式的行,相信大家对它都不陌生。
它的名字来源于ed——unix早期的一款行编辑器——的`g/re/p`命令,ed和grep是由Ken Thompson实现的,grep作为一个单独的应用最早出现于Unix V4中。
常见用法
grep常见的使用场景是结合管道,对上一条命令的结果进行过滤,比如经常用于查找进程的命令:
PS: 一般我们会把`process_name`的首字母用`[]`括起来,主要是避免最后输出的结果包含了grep本身的进程。
因为正则表达式[p]rocess能匹配到“process”,但无法匹配到“[p]rocess”。
或者是搜索文件中的指定内容,比如查找日志中的特定关键字:
grep的正则表达式语法
今天我想聊的是`grep`的正则表达式语法。`grep`支持三种正则表达式语法,分别叫做:basic regular expression(BRE)、extended regular expression(ERE)和 Perl regular expression。最后一种是实验性的特性,我也没有研究过,就暂且不表,主要讲讲前两者。对于GNU grep,BRE和ERE这两种语法提供的功能是一样的,只不过是语法不同而已;对于其他的实现,BRE语法提供的功能会更少些(嗯,没有用过其他的实现版本,所以我就不举例了^_^了)。
在BER语法中,元字符?、+、{、|、(、)并没有特殊的含义,就是表示自身,如果需要它们的特殊含义,需要使用转义的写法\?、\+、\{、\|、\(、\)。
举个例子,假设我们需要查询服务器上的tomcat和weblogic进程信息:
它的名字来源于ed——unix早期的一款行编辑器——的`g/re/p`命令,ed和grep是由Ken Thompson实现的,grep作为一个单独的应用最早出现于Unix V4中。
常见用法
grep常见的使用场景是结合管道,对上一条命令的结果进行过滤,比如经常用于查找进程的命令:
PS: 一般我们会把`process_name`的首字母用`[]`括起来,主要是避免最后输出的结果包含了grep本身的进程。
因为正则表达式[p]rocess能匹配到“process”,但无法匹配到“[p]rocess”。
或者是搜索文件中的指定内容,比如查找日志中的特定关键字:
grep的正则表达式语法
今天我想聊的是`grep`的正则表达式语法。`grep`支持三种正则表达式语法,分别叫做:basic regular expression(BRE)、extended regular expression(ERE)和 Perl regular expression。最后一种是实验性的特性,我也没有研究过,就暂且不表,主要讲讲前两者。对于GNU grep,BRE和ERE这两种语法提供的功能是一样的,只不过是语法不同而已;对于其他的实现,BRE语法提供的功能会更少些(嗯,没有用过其他的实现版本,所以我就不举例了^_^了)。
在BER语法中,元字符?、+、{、|、(、)并没有特殊的含义,就是表示自身,如果需要它们的特殊含义,需要使用转义的写法\?、\+、\{、\|、\(、\)。
举个例子,假设我们需要查询服务器上的tomcat和weblogic进程信息:
1. 使用BRE写法:
ps -ef | grep '\([t]omcat\|[w]eblogic\)'
2. 使用ERE写法:
ps -ef | grep -E '([t]omcat|[w]eblogic)'
通过上面两种写法就可以看出来,BRE语法需要转义的字符太多了,如果我们写的是稍微复杂点的正则表达式,推荐使用ERE语法,即使用`grep`的`-E`选项。
参考材料
1. grep man手册:https://linux.die.net/man/1/grep
2. grep维基百科:https://en.wikipedia.org/wiki/Grep
3. Ken Thompson维基百科: https://en.wikipedia.org/wiki/Ken_Thompson
阅读全文