十五、全局搜索正则表达式

一.grep简介

grep 全程Globally search a Regular Expression and Print,是一种强大的文本搜索工具,它能使用特 定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep和egrep

二.grep的工作模式

1.grep执行语法

cpp 复制代码
grep [option] file...

2.工作方式

  • grep在一个或者多个文件中搜索字符串模板
  • 如果模板中包括空格,需要使用引号引起来
  • 模板后的所有字符串会被看作是文件名

3.工作结果

  • 如果模板搜索成功,则返回0状态码
  • 如果搜索不成功,则返回1状态码
  • 如果搜索的文件不存在,则返回2的状态码

三.grep的常用参数详解

1.常用参数详解

|----|------------------------------------------|
| 选项 | 说明 |
| -i | 忽略大小写 |
| -e | 实现多个选项间的逻辑或关系 |
| -E | 如果pattern是扩展正则表达式,需要使用-E选项,grep -E=egrep |
| -n | 显示行号 |
| -w | 按照单词匹配 |
| -o | 只显示匹配到的内容 |
| -v | 不显示匹配到的行 |
| -c | 统计匹配的行数 |

cpp 复制代码
[root@node mnt]# vim sen
[root@node mnt]# grep root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:chroot:test
test:test:root
[root@node mnt]# grep -i root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:ROOT:test
test:chroot:test
test:test:root
[root@node mnt]# grep root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:chroot:test
test:test:root
[root@node mnt]# grep root bash sen
grep: bash: No such file or directory
sen:root:x:0:0:root:/root:/bin/bash
sen:operator:x:11:0:operator:/root:/sbin/nologin
sen:test:root:test
sen:test:chroot:test
sen:test:test:root
[root@node mnt]# grep -e root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:chroot:test
test:test:root
[root@node mnt]# grep lp sen
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@node mnt]# grep -n lp sen
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@node mnt]# grep -A2 lp sen
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@node mnt]# grep -B2 lp sen
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@node mnt]# grep -w root sen
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:root:test
test:test:root
[root@node mnt]# grep -o root sen
root
root
root
root
root
root
root
[root@node mnt]# grep root sen -v
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
test:ROOT:test

[root@node mnt]# grep root sen -c
5

四.正则表达式的使用

1.什么是正则表达式

正则表达式就是用在字符串的处理上面的一项表示式

在我们做程序设计时很多需要对一类字符进行处理,正则表达式就完美的解决了这个问题

2.正则表达式

基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达 式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一, 另外一种语法标准称为扩展正则表达式

扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符

|-------------------------|-------|----------------------------------------|
| 元字符 | 表达式类型 | 说明 |
| ^ | 基本正则 | 以某个字符开头 |
| $ | 基本正则 | 以某个字符结尾 |
| . | 基本正则 | 匹配任意单字符 |
| * | 基本正则 | 字符出现0到任意次 |
| ? | 基本正则 | 字符出现0到1此 |
| + | 基本正则 | 字符出现1到任意次 |
| {m,n} | 基本正则 | 将前一项字符重复m-n次,{m,},{,n},{m} |
| [] | 基本正则 | 对方括号内的单字符进行匹配 |
| [^] | 基本正则 | 不匹配方括号内的单字符 |
| ^[] | 基本正则 | 匹配以某个字符开头的行 |
| \ | 基本正则 | 转义字符,让一些特殊符号失效 |
| () | 基本正则 | 定义一个子表达式 |
| (str1 | str2) | 基本正则 | 匹配str1 或str2 |
| 词首【或\b】和词尾锚定 【>或者\b】 | 基本正则 | 其后面的任意字符必须作为单词首部出现;其前面的 任意字符必须作为单词尾部出现 |

Note

在grep命令使用基本正则表达式时不需要加任何参数

在grep命令使用扩展正则表达式时必须加-E参数

示例:

a.过滤以root开头的行,过滤以root开头bash结尾的行

cpp 复制代码
[root@node shell]# grep ^root testfile
root:x:0:0:root:/root:/bin/bash
[root@node shell]# grep -E "(^root|bash$)" testfile
root:x:0:0:root:/root:/bin/bash

b.过滤以root结尾的行

cpp 复制代码
[root@node shell]# grep root$ testfile
test:test:root

c.搜索e开头y结尾的三字符单词,搜索e开头y结尾的四字符单词

cpp 复制代码
[root@node shell]# vim testfile1
eay
eby
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy
[root@node shell]# grep e.y testfile1
eay
eby
[root@node shell]# grep e..y testfile1
eaay
ebby
eaby

d.搜索e开头Y结尾的所有行

cpp 复制代码
[root@node shell]# grep e.*y testfile1
eay
eby
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy

e.搜索自定次数出现的字符

cpp 复制代码
[root@node shell]# grep -E "e.{2}y" testfile1
eaay
ebby
eaby
[root@node shell]# grep -E "e.{,2}y" testfile1
eay
eby
eaay
ebby
eaby
[root@node shell]# grep -E "e.{2,}y" testfile1
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy
[root@node shell]# grep -E "e.{2,3}y" testfile1
eaay
ebby
eaaay
ebbby
eaby
[root@node shell]# grep -E "e.?y" testfile1
eay
eby
[root@node shell]# grep -E "e.+y" testfile1
eay
eby
eaay
ebby
eaaay
ebbby
eaaaaay
ebbbbby
eababy
eaby
eabababy
[root@node shell]# grep -E "e[^ac]?y" testfile1
eby
[root@node shell]# grep -E "e[ac]?y" testfile1
eay
[root@node shell]# grep -E "e(ab)?y" testfile1
eaby

3.正则表达式字符集

|------------------|---------------------------------------------------------------|
| 字符 | 说明 |
| [[:alpha:]] | 匹配任意一个字母,等价于 [A-Za-z] |
| [[:alnum:]] | 匹配任意一个字母或者数字,等价于 [A-Za-z0-9] |
| [[:digit:]] | 匹配任意一个数字,等价于 0-9 |
| [[:lower:]] | 匹配任意一个小写字母,等价于 a-z |
| [[:upper:]] | 匹配任意一个大写字母,等价于 A-Z |
| [[:space:]] | 匹配任意一个空白符,包括空格、制表符、换行符以及分页符 |
| [[:blank:]] | 匹配空格和制表符 |
| [[:graph:]] | 匹配任意一个看得见的可打印字符,不包括空白字符 |
| [[:print:]] | 匹配任何一个可以打印的字符,包括空白字符,但是不包括控制字符、字符串结束 符'\0' 、 EOF 文件结束符( -1 ) |
| [[:cntrl:]] | 匹配任何一个控制字符,即 ASCII 字符集中的前 32 个字符。例如换行符、制表符等 |
| [[:punct:]] | 匹配任何一个标点符号,例如 "[]" 、 " {}"或者 "," 等 |
| [[:xdigit:]] | 匹配十六进制数字,即 0-9 、 a-f 以及 A-F |

Note

通配符和正则表达式比较

1.通配符和正则表达式看起来有点像,不能混淆,可以简单的理解为通配符只有\*,?,[],{}这4种,而正 则表达式复杂多了

2.在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表 达式中他是重复之前的一个或者多个字符,不能独立使用的。

相关推荐
MZWeiei3 分钟前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper
7yewh18 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
Arenaschi22 分钟前
在Tomcat中部署应用时,如何通过域名访问而不加端口号
运维·服务器
小张认为的测试22 分钟前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
waicsdn_haha29 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
打鱼又晒网30 分钟前
linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
linux·网络协议·计算机网络·tcp
良许Linux44 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
蜜獾云1 小时前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维1 小时前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
Hacker_Oldv1 小时前
WPS 认证机制
运维·服务器·wps