【Linux】grep命令与正则表达式(RegExp)
文章目录
- 一、开发环境介绍
- 二、Linux中grep的作用
- 三、grep命令使用格式和常用选项
- 四、grep中常用的正则表达式
- 1、正则表达式的基本单位/元字符
- 2、正则表达式的重复限定符
- 3、正则表达式的定位符
- 4、正则表达式的分组
- 5、正则表达式中的转义字符
- 6、正则表达式中的条件或
- 五、grep命令与管道的组合运用
一、开发环境介绍
本文使用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
【Linux】grep命令与正则表达式(RegExp)相关推荐
- Linux grep命令,正则表达式
grep命令及正则表达式 grep命令 grep , egrep , fgrep grep,sed,awk 文本处理三剑客 grep: Global search REgular expression ...
- linux grep命令参数及用法详解---linux管道命令grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- linux grep命令总结
风生水起 善战者,求之于势,不责于人,故能择人而任势. 博客园 首页 新随笔 联系 订阅 管理 posts - 791, comments - 394, trackb ...
- Linux grep 命令初步学习
Linux grep 命令用于查找文件里符合条件的字符串. grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显 ...
- Linux grep命令、Linux cd命令、Linux pwd命令
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Linux grep命令用于查找文件里符合条件的字符串. grep指令用于查找内容包含指定的范本样式 ...
- linux grep命令例子,详解linux grep命令
本文介绍了linux grep命令,具体如下: 1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regu ...
- 【Shell牛客刷题系列】SHELL5 打印空行的行号:一起学习grep命令搭配正则表达式的使用
该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...
- Linux之grep命令与正则表达式
文章目录 grep命令 知识储备 正则表达式 1. 正则表达式的分类 1. 普通正则表达式 2. 拓展正则 案例 grep命令 Linux三剑客之一,文本过滤器(根据文本内容过滤文件) 语法格式:gr ...
- Linux的gre命令匹配数字,linux之grep命令和正则表达式练习
1.创建一个文档FILE,里面写如下内容: he love his lover she like her liker they love their liker 使用grep命令来搜索以l开头,以e结 ...
最新文章
- 计算机的网络端口管理器,Win7设备管理器没有端口选项的三大原因及解决措施...
- 用Redux来进行组件间通讯
- Android开发之购物车加减按钮(附加源码)
- 华为手机出现android啥意思,传华为正研发手机系统,如果脱离安卓系统,还有啥能阻止华为前进...
- Google Bigtable
- java堆内存和堆外内存_Java堆空间,本机堆和内存问题
- 全套学习!mysql命令窗口执行sql文件
- 蓝牙耳机音量大解决办法_长时间使用蓝牙耳机的危害这么大?我们到底该选什么蓝牙耳机呢?...
- 使用webpack打包后的vue项目如何运行(express)
- 10月10日见!官方再曝OPPO K5外观配置细节:6400万超清四摄加持
- C语言学习笔记---打印函数printf()和sprintf()函数
- 王者荣耀战力查询微信小程序源码下载支持安卓苹果微信Q等多区查询
- 数据结构严蔚敏--综述
- 如何保证同一个账号同时只能在一个设备登录,账号自动登录
- 步步为营Hibernate全攻略(二)剪不断理还乱之:一对多关联映射
- 5G发展的五大动力和四大挑战
- 笔记:echarts 标题(title)设置
- 联想电脑的手触屏失灵
- 如果没有杰顿·桑乔,谁应该曼彻斯特联合标志
- 岗位来啦-华为研发OD招聘