一、开发环境介绍
本文使用VMware虚拟机,运行Ubuntu 18.04.1 LTS版本。使用的Linux内核版本为4.15.0。建立ssh远程连接,通过Xshell操作虚拟机。 另外,使用的shell脚本为bash。
二、Linux中grep的作用
grep命令是一种命令行实用程序,用于在纯文本数据集中搜索与正则表达式匹配的行。通过find命令可以在/bin命令下找到grep命令的可执行程序。 grep命令的全称是"Globally search for a regular expression and print matching lines" 从中可以看到grep命令几个特点:1)globel 全文件搜索。这是因为在Unix、Unix-like系统中为了要彻底搜索一个文件,有的用户在要搜索的字符串前加上前缀 global。2)regular expression 正则表达式匹配。3)matching lines 按行匹配。4)print 打印信息。 grep还有变体程序egrep、fgrep、rgrep,它们的作用分别与grep -E、grep -F、grep -r相同。
三、grep命令使用格式和常用选项
Linux manual给出的grep命令SYNOPSIS有下列三种,其中常用的是第一种
1)grep [OPTIONS] PATTERN [FILE...]
2)grep [OPTIONS] -e PATTERN ... [FILE...]
3)grep [OPTIONS] -f FILE ... [FILE...]
grep命令有以下常用选项:
OPTION | DESCRIPTION | FUNCTION |
---|
-n | line number | 显示行号 | -E | extended-regexp | 使用拓展正则表达式规则 | -F | fixed-strings | 不使用正则表达式规则 | -i | ignore-case | 无视大小写 | -c | count | 只显示匹配总数,不显示匹配行号 | -w | word-regexp | 把pattern作为一个单词匹配 | -v | invert-match | 反向匹配,匹配结果为不包含匹配文本的所有行 | -l | –files-with-matches | 列出包含匹配项的文件名 | -L | files-without-match | 列出不包含匹配项的文件名 |
其中 -w 相当于正则表达式中的 "\< \>" 即以grep -nEw “how” file匹配到的只能是完整的how,however不会作为匹配对象。 常用选项中使用最多的一般是 -nE
四、grep中常用的正则表达式
我们都知道Linux find命令通过通配符 “*” 、"?" “[]” 进行匹配,而Linux grep命令使用的是正则表达式(Regular expression)我们可以简单粗暴地将正则表达式理解为高级版的通配符。
1、正则表达式的基本单位/元字符
基本单位/元字符 | 含义 |
---|
平凡字符 | 字面内容匹配 | . | 匹配任一字符 | [集合] | 集合内任意元素 | [^集合] | 非集合内的任意元素 | \d | 匹配数字 | \w | 匹配字母或数字或下划线或汉字 | \s | 匹配任意的空白符 |
举几个例子: 1、“Hello” 表示匹配字面内容Hello 2、"[abc]" 表示匹配a、b、c中的任一字符 3、"[a-zA-Z]" 表示匹配大小写字母中的任一字符 4、“a\b” 表示匹配连续出现的a和任一字符
2、正则表达式的重复限定符
正则表达式中连续出现的基本单位,如 “基本单位A基本单位B” 起到连接的作用,表示连续出现的A和B,但是对于过多连续出现的基本单位,只用元字符的方式进行书写就显得太繁琐了,这里就要引入正则表达式的重复限定符了。
重复限定符 | 作用 |
---|
* | 重复0~+∞次 | ? | 重复0或1次 | + | 重复1~+∞次 | {n} | 重复n次 | {n,} | 重复n~+∞次 | {n,m} | 重复n~m次 |
例如在该文件中 有:
3、正则表达式的定位符
为了使得搜索更加精确,我们需要在正则表达式中添加定位符 常见的定位符有
定位符 | 作用 |
---|
^ | 匹配位于 行首 的字符串 | $ | 匹配位于 行尾 的字符串 | \< | 匹配位于 单词开头 的字符串 | \> | 匹配位于 单词结尾 的字符串 | \b | 匹配一个单词边界,即从单词靠近空格的地方开始查找。 | \B | 匹配非单词边界 |
之前已经提过,利用 “\< 和 \>” 可以完整地匹配一个单词,相当于 grep 命令中的 -w选项。
对于 4.2 正则表达式的重复限定符 中的temple文件,有
4、正则表达式的分组
重复限定符作用在左边最近的一个基本单位上,如果需要重复限定符对整个正则表达式生效,需要用到正则表达式的分组。正则表达式中用小括号()来做分组,也就是括号中的内容作为一个整体。 依旧以 4.2 正则表达式的重复限定符 中的temple为例 有以下操作
5、正则表达式中的转义字符
针对要匹配 “.”、"+"、"*" 等需要把这些元字符、限定符或者关键字转义成普通的字符的情形,与转移字符的规则相同,只要在这些字符之前加上 “\” 即可。 如要匹配以 (ab) 开头的字符
$ grep -nE "^(\(ab\))" file
不难理解,最外面的括号用于表示分组,里面两个括号分别与 “\” 组合成转移字符
6、正则表达式中的条件或
正则表达式支持条件或,表示匹配满足分支条件中的任一种条件。
如在temple中进行以下操作
$ grep -nE "bo+k|(aba)+" temple
结果如下
五、grep命令与管道的组合运用
管道可以运用于重定向,将一个程序或命令的输出作为另一个程序或命令的输入。这里通过xargs 将管道输入的数据转换成命令行参数。
以下是一个在多个.c文件中查找fun1.c函数定义的例子
$ find -name "*.c" |xargs grep -nE "func1.+{"
The end
|