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

一.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个或多个字符,而在正则表 达式中他是重复之前的一个或者多个字符,不能独立使用的。

相关推荐
想学后端的前端工程师6 分钟前
【补充内外网突然不通的情况】
运维·服务器
面汤放盐10 分钟前
何时使用以及何时不应使用微服务:没有银弹
java·运维·云计算
子琦啊32 分钟前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
AOwhisky1 小时前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
小龙在慢慢变强..2 小时前
目录结构(FHS 标准)
linux·运维·服务器
2035去旅行2 小时前
嵌入式开发,如何选择C标准库
linux·arm开发
刘延林.2 小时前
win11系统下通过 WSL2 安装Ubuntu 24.04 使用RTX 5080 GPU
linux·运维·ubuntu
星恒讯工业路由器2 小时前
星恒讯工业生产自动化解决方案
运维·物联网·自动化·智能路由器·信息与通信
a8a3023 小时前
Laravel9.x新特性全解析
运维·spring boot·nginx