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

发布于:2024-12-07 ⋅ 阅读:(116) ⋅ 点赞:(0)

一.grep简介

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

二.grep的工作模式

1.grep执行语法

grep [option] file...

2.工作方式

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

3.工作结果

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

三.grep的常用参数详解

1.常用参数详解

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

[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结尾的行

[root@node shell]# grep root$ testfile
test:test:root

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

[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结尾的所有行

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

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

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