Shell编程之正则表达式

本文介绍了正则表达式的基础知识,包括什么是正则表达式、为何使用、如何学习和使用。详细讲解了基本正则表达式和扩展正则表达式的特性和元字符,并给出了多个使用grep命令进行正则表达式匹配的实验示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 正则表达式

1.1 什么是正则表达式

1.2 为什么使用正则表达式

1.3 如何学习正则表达式

1.4 如何使用正则表达式

1.5 基本正则表达式

正则表达式字符集 

1.6 扩展正则表达式

1.7 正则表达式实验

实验一:显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行

实验二:显示/etc/passwd中以sh结尾的行

实验三:显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非

                空白字符的行

实验四:查找/etc/rc.d/rc.local中包含“以to开始并以to结尾”的字串行

实验五:查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行

实验六:查找ifconfig命令结果中的1-255之间的整数

实验七:显示/var/log/secure文件中包含“Failed”或“FAILED”的行

实验八:在/etc/passwd中取出默认shell为bash的行

实验九:以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息

实验十:高亮显示passwd文件中冒号,及其两侧的字符


1. 正则表达式

1.1 什么是正则表达式

正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的
说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,
得到了许多程序设计语言的支持,包括Java C++ Perl 以及 Shell 等。

1.2 为什么使用正则表达式

在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查
找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使
得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。

1.3 如何学习正则表达式

1. 重点在于理解元字符
2. 掌握好正则表达式的语法
3. 开拓思路,寻找最佳的表达方法

1.4 如何使用正则表达式

当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其
正确与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell 命令
行中,用户可以使用grep 命令来测试。
grep 家族有三大成员分别为
        grep :支持使用基本正则表达式。
        egrep :支持使用扩展正则表达式。
        fgrep :不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅拥
                    有其字面意义,不再拥有特殊意义。
grep 命令的名称来自于全局搜索正则表达式并打印文本行( Global Search Regular Expression
and Print out the line)的缩写。它是一个非常古老的 UNIX 命令,也是一种强大的文本搜索工具。
grep 命令使用正则表达式来搜索文本,并且把匹配的文本行打印出来。 grep命令根据用户指定的”
pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。
:PATTERN 即过滤条件指由文本字符及正则表达式元字符所编写的字符串。
grep命令的基本语法如下:
grep [options] pattern [file…]
在上面的语法中, options 表示选项,选项列表如下表。 pattern 表示要匹配的模式, file 表示一系列
的文件名。grep 命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出来。模式后
面的所有的字符串参数都被看作是文件名。
-n
显示行号
-o
只显示匹配的内容
-q
静默模式,没有任何输出,得用 $? 来判断执行成功没有,即有没有过滤到想要的内容
-l
如果匹配成功,则只将文件名打印出来,失败则不打印,通常 -rl 一起用, grep -rl 'root' /etc
-A
如果匹配成功,则将匹配行及其后 n 行一起打印出来
-B
如果匹配成功,则将匹配行及其前 n 行一起打印出来
-C
如果匹配成功,则将匹配行及其前后 n 行一起打印出来
--color
高亮颜色显示匹配到的字符串
-c
如果匹配成功,则将匹配到的行数打印出来
-E
等于 egrep ,扩展
-i
忽略大小写
-v
取反,不匹配
-w
匹配单词
-r
递归搜索,不仅搜索当前目录,还要搜索其各级子目录
-s
显示关于不存在或者无法读取文件的错误信息

1.5 基本正则表达式

基本正则表达式( Basic Regular Expression BRE ),又称为标准正则表达式,是最早制订的正
则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX 规范制订的两种正则表达式语
法标准之一,另外一种语法标准称为扩展正则表达式。
字符含义
^
在每行的开始进行匹配
$
在每行的末尾进行匹配
.
对任何单个字符进行匹配
*
对前一项进行 0 次或多次重复匹配
[str]
str 中的任何单个字符进行匹配
[^str]
对任何不在 str 中的单个字符进行匹配
[a-b]
a b 之间的任何字符进行匹配
\
忽略后面一个字符的特殊含义

例如:

1 ^word 表示搜索以 word 开头的内容。
2 word$ 表示搜索以 word 结尾的内容。
3 ^$ 表示空行,不是空格。
4 . 代表且只能代表一个任意字符。
5) \ 转义字符,让有着特殊身份意义的字符失效。
      例如: \. 只表示小数点,还原原始的小数点的意义。
6 * 重复 0 个或多个前面的字符
7 .* 匹配所有的字符。 ^.* 任意多个字符开头。
8 [] 匹配字符集合内任意一个字符,如 [a-z]
9)[^abc] ^ 在中括号里表示非,不包含 a b c
10 {n,m} 匹配 n m 次,前一个字符。
        {n,} 至少 N 次,多了不限。
        {n} n
        {,m} 至多 m 次,少了不限。
       注意: grep 要将 {} 转义, \{\},egrep 不需要转义
12 \(\) ,定义子表达式的开始和结束位置。例如,正则表达式 “\(love\).*\1” 表示匹配 2 个                  “love”  中间包含任意个字符的文本行,其中“\1” 表示引用前面的 “love”
13 \< \b: 锚定词首 ( 支持 vi grep) ,其后面的任意字符必须作为单词首部出现,如 \<love   
        或 \blove
14 \> \b: 锚定词尾 ( 支持 vi grep) ,其前面的任意字符必须作为单词尾部出现,如 love\>
        love\b

正则表达式字符集 

字符说明
[[:alnum:]]
匹配任意一个字母或者数字,等价于 [A-Za-z0-9]
[[:alpha:]]
匹配任意一个字母,等价于 [A-Za-z]
[[: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

1.6 扩展正则表达式

扩展正则表达式( Extended Regular Expression ERE )支持比基本正则表达式更多的元字符,
但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”
“$” “.” “*” 、“[]”以及 “[^]” 6 个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全
相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。
字符含义
+
对前一项进行 1 次或多次重复匹配
对前一项进行 0 次或 1 次重复匹配
{i}
对前一项进行 j 次重复匹配

{j,}

对前一项进行 j 次或更多次重复匹配
{,k}
对前一项最多进行 k 次重复匹配
{s|t}
匹配 s 项或 t 项中的一项

1.7 正则表达式实验

实验一:显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行

我的/etc/rc.d/目录下没有rc.sysinit文件,只有一个rc.local文件,并且里面没有以h开头的行,场面一度尴尬…
但是解题代码还是有的,如下:

[root@manager ~]# cat /etc/rc.d/rc.sysinit | grep -i ^h
[root@manager ~]# grep -i '^h' /etc/rc.d/rc.sysinit

两者均可实现,选择其一均可。

实验二:显示/etc/passwd中以sh结尾的行

[root@manager ~]# grep "sh$" /etc/passwd

 实验三:显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非

                空白字符的行

[root@manager ~]# egrep "^\#[[:space:]]\+[^[:space:]]\+" /etc/fstab

实验四:查找/etc/rc.d/rc.local中包含“以to开始并以to结尾”的字串行

[root@manager ~]# egrep -w "(to).*\1" /etc/rc.d/rc.local

实验五:查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行

[root@manager ~]# grep -w "\<s[a-Z]*d\>" /etc/inittab

 实验六:查找ifconfig命令结果中的1-255之间的整数

方法一:

[root@manager ~]# ifconfig | grep -oE "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
[root@manager ~]# ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
192
168
139
128
255
255
255
192
168
139
……
这里就展示部分结果啦

 方法二:

[root@manager ~]# ifconfig | egrep "\<([1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

 实验七:显示/var/log/secure文件中包含“Failed”或“FAILED”的行

[root@manager ~]# egrep -w "F(ailed|AILED)" /var/log/secure
[root@manager ~]# egrep -w "F(ailed|AILED)" /var/log/secure
Jan  3 09:30:58 manager gdm-launch-environment][1310]: pam_systemd(gdm-launch-environment:session): Failed to release session: Interrupted system call

 实验八:在/etc/passwd中取出默认shell为bash的行

[root@manager ~]# grep -w "bash$" /etc/passwd

 实验九:以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息

[root@manager ~]# ls -l /etc/ns*.conf

实验十:高亮显示passwd文件中冒号,及其两侧的字符

[root@manager ~]# grep -E ".?:*:.?" /etc/passwd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值