【Linux】grep命令与正则表达式(RegExp)


一、开发环境介绍

本文使用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还有变体程序egrepfgreprgrep,它们的作用分别与grep -Egrep -Fgrep -r相同。


三、grep命令使用格式和常用选项

Linux manual给出的grep命令SYNOPSIS有下列三种,其中常用的是第一种

1)grep [OPTIONS] PATTERN [FILE...]
2)grep [OPTIONS] -e PATTERN ... [FILE...]
3)grep [OPTIONS] -f FILE ... [FILE...]

grep命令有以下常用选项:

OPTIONDESCRIPTIONFUNCTION
-nline number显示行号
-Eextended-regexp使用拓展正则表达式规则
-Ffixed-strings不使用正则表达式规则
-iignore-case无视大小写
-ccount只显示匹配总数,不显示匹配行号
-wword-regexp把pattern作为一个单词匹配
-vinvert-match反向匹配,匹配结果为不包含匹配文本的所有行
-l–files-with-matches列出包含匹配项的文件名
-Lfiles-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
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值