第11章 正则表达式

本文详细介绍了正则表达式的概念,包括基础正则表达式中的元字符及其用法,如查找、替换和匹配特定模式。还探讨了扩展正则表达式的特性,如重复、选择和分组。通过实例演示了如何在shell脚本中使用grep命令和正则表达式进行字符串处理和筛选。
摘要由CSDN通过智能技术生成

11.1 什么是正则表达式

处理字符串的方法,以行为单位来进行字符串的处理操作,正则表达式通过一些特殊符号的辅助,可以让用户轻易地完成【查找、删除、替换】某特定字符串的处理过程

11.2 基础正则表达式

基础正则(第一类)
#元字符意义示例
1^word以关键字 word 开头的行

grep '^hello' a.txt

在a.txt 文件中,查找以 hello 开头的行

image.png

2word$以关键字 word 结尾的行

grep 'hello$' a.txt

在a.txt 文件中,查找以 hello 结尾的行

image.png

3.一定有一个任意字符

grep 'e.e' a.txt

在a.txt 文件中,查找有exe的行,x 代表一个任意字符

image.png

4*重复零个或者无穷多个的前导字符

grep 'ess*' a.txt

在a.txt 文件中,查找带有es的行

image.png

5[list]查找包含list集合中任意一个字符

grep 'es[ab]' a.txt

在a.txt 文件中,查找带有esa 或者 esb 的行

image.png

6[n1-n2]列出想要查找的所有字符范围

grep '[a-z]' a.txt

在a.txt 文件中,查找带有小写字母的行

image.png

7[^list]列出不需要的字符范围

grep '[^a-z]' a.txt

在a.txt 文件中,过滤掉纯小写字母的行

注:如果某行同时包含小写字母以及还有其余的字符,那么该行也会被找出来

image.png

8^[list]查找包含list集合中任意一个字符开头的行

grep '^[a-z]' a.txt

在a.txt 文件中,查找小写字母开头的行

image.png

9^[^list]查找不以包含list集合中任意一个字符开头的行

grep '^[^a-z]' a.txt

在a.txt 文件中,查找不是以小写字母开头的行

image.png

10\{n\}前导字符连续出现 n 次

grep 'l\{2\}' a.txt

在a.txt 文件中,查找 l 连续出现两次的行

11\{n,\}前导字符至少连续出现 n 次

grep 'l\{2,\}' a.txt

在a.txt 文件中,查找 l 至少连续出现两次的行

12\{n,m\}前导字符连续出现 n 到 m 次

grep 'l\{2,3\}' a.txt

在a.txt 文件中,查找 l 连续出现两次到三次的行

13\转义字符,将特殊符号的意义去掉

grep '^\$' a.txt

在a.txt 文件中,查找$开头的行

* . ? + $ ^ [ ] ( ) { } | \ / 共计15个

14\<word查找单词中包含word开头的单词

grep '\<hel' a.txt

在a.txt 文件中,查找包含 以hel 开头的单词行

image.png

15word\>查找以word结尾的单词

grep 'lo\>' a.txt

在a.txt 文件中,查找包含 以lo 结尾的单词行

image.png

16\<word\>只匹配word单词

grep '\<lo\>' a.txt

在a.txt 文件中,查找 lo 单词行

17\( \)

表示分组(括号内的内容)匹配到的部分。

\1 和 \2 是用来引用分组捕获的内容的特殊符号。

echo 'Hello, World !'| sed 's/\(Hello\), \(World\) !/Goodbye, \2, \1!/'

将Hello, World ! 替换成 Goodbye, World, Hello!

18.*任意字符

grep '.*' a.txt

在a.txt 文件中,查找任意字符

19^$空行

grep '^$' a.txt

在a.txt 文件中,查找空白行

20\d匹配数字,等同[0-9] 

grep -P '\d' a.txt

在a.txt 文件中,查找数字

21\w匹配字母数字下划线,等同[0-9a-zA-Z_]

grep -P '\w' a.txt

在a.txt 文件中,查找字符和数字以及下划线

22\s匹配空格、制表符、换页符,等同[\t\r\n]

grep -P '\s' a.txt

在a.txt 文件中,查找空格、制表符、换页符

基础正则(第二类)
#表达式含义示例
1[:alnum:]字母与数字字符[[:alnum:]]
2[:alpha:]字母字符(包括大小写)[[:alpha:]]
3[:blank:]空格与制表符[[:blank:]]
4[:digit:]数字[[:digit:]]
5[:lower:]小写字母[[:lower:]]
6[:upper:]大写字母[[:upper:]]
7[:punct:]标点符号

[[:punct:]]

8[:space:]换行符、回车等在内的所有空白[[:space:]]

扩展正则:
#元字符意义示例
1+重复一个或者一个以上的前导字符

grep -E 'l+' a.txt

在a.txt 文件中,查找字符 l 的行

2零个或者一个前导字符

grep -E 'l?' a.txt

在a.txt 文件中,查找没有字符 l 或者最多两个的行

3|

grep -E 'hello|abc' a.txt

在a.txt 文件中,查找hello 或者abc 的行

4()() 通常表示一个分组,允许将多个字符作为一个整体进行处理

grep -E '(abc)+' a.txt

在a.txt 文件中,查找至少有一个abc 的行

5()+重复括号内的内容

grep -E '(abc)+' a.txt

在a.txt 文件中,查找至少有一个abc 的行

四、总结:

  • 目标:要找什么?

    找数字    [0-9]

    找字母    [a-zA-Z]

    找标点符号   [[:punct:]]

  • 方法:如何找?

       以什么开头    ^key

       以什么结尾    key$

       包含什么       [abc]

       不包含什么    [^abc]

  • 找多少?

       找前导字符出现0次或者多次     ab*

       找任意单个字符                        ab.

       找任意字符                               ab.*

       找前导字符连续出现多次           \{n\}   \{n,\}  \{n,m\}   {n}  {n,}  {n,m}

       找前导字符出现1次或者多次     go+

       找前导字符出现0次或者1次      go?

五、巩固练习

#题目shell写法
1查找不以大写字母开头的行

1、grep '^[^A-Z]'   a.txt

2、grep  -v  '^[A-Z]'   a.txt

3、 grep '^[^[:upper:]]' a.txt

2查找有数字的行

1、grep '[0-9]'   a.txt

2、grep  -P  '\d'   a.tx

3查找一个数字和一个字母连起来的行

1、grep  -E '[0-9][a-zA-Z]|[a-zA-Z][0-9]'   a.txt

2、grep  -E '[0-9][a-Z]|[a-Z][0-9]'   a.txt
4查找不以 r 开头的行

1、grep '^[^r]'   a.txt

1、grep  -v '^r'   a.txt

5查找以数字开头的行

1、grep '^[0-9]'   a.txt

2、grep  -P '^\d'   a.txt

备注

        第一个命令使用基本正则表达式语法,使用 [0-9] 来匹配任意一个数字,使用广泛

        第二个命令使用 Perl 兼容的正则表达式语法,使用 \d 来匹配任意一个数字。

6查找以大写字母开头的行

1、grep '^[A-Z]'   a.tx

7查找以小写字母开头的行

1、grep '^[a-z]'   a.tx

8查找以点结束的行

1、grep '\.$'   a.tx

9去掉空行

1、grep  -v  '^$'   a.txt

10查找完全匹配abc的行

1、grep '\<abc\>' a.txt

2、grep  -w  'abc'   a.txt

11查找A后面有三个数字的行

1、grep   -E   'A[0-9]{3}'   a.txt

2、grep    'A[0-9]\{3\}'   a.txt

备注:

        1中使用-E是使用扩展正则表达式,{n} 用于表示前面的元素恰好出现 n 次

        2中为基本正则表达式,\{n\} 需要用\将{}转义

12统计root在/etc/passwd下出现了几次

1、grep   -o 'root'   a.txt | wc -l

13匹配合法的IP地址

1、[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}

2、[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}

3、[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

4、[0-9]{1,3}\.){3}[0-9]{1,3}

5、(\d{1,3}\.){3}\d{1,3}

6、(\d+\.){3}\d+

14查找出IP地址、广播地址、子网掩码

1、ifconfig eth0|grep -E  '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -r 's/ +//'|cut -d' ' -f2,5,8

注:字符串开头有多个空格,cut 命令将无法正确识别第一个字段。此时,可以使用 sed 命令先将连续的空格替换为单个空格

2、ifconfig eth0|grep -E  -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

3、ifconfig eth0|grep -E  -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

15找出全部是数字的行

1、grep  -E  '^[0-9]+$'   a.txt

+ 可以替换成*吗

16找出文件中以235结尾的IP地址并且替换成172.16.53.235

1、grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' a.txt| sed   's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.\(235\)/172.16.53.\1/'

在 sed 命令中,当使用 "-n" 选项时,会关闭默认的输出功能。这意味着,经过处理的文本行不会自动显示在屏幕上。

如果想要显示特定的处理行,可以使用 sed 的 "p" 命令来进行显式打印。通过将 "p" 命令与适当的模式匹配条件结合使用,可以选择性地打印出经过处理的行。

17查找文件中的合法ip,不合法的不打出
1、grep -E -o '((25[0-5]|2[0-4][0-9]|[0-1][0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|[0-1][0-9]{1,2})' a.txt

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值