22-正则表达式-《shell脚本》

admin 2025-11-06 14:38:37 系统网络 来源:ZONE.CI 全球网 0 阅读模式
  • 正则表达式
    • 1、正则表达式介绍
    • 2、正则表达式特殊字符
    • 3、正则表达式POSIX字符
    • 4、练习案例

    处理海量日志对每一个运维来说都非常的头疼,日志分析我们首先需要把需要的数据从海量的日志中匹配出来,降低数据量,然后在分析这些日志。那么从海量的日志中把我们需要的日志找出来就需要我们写一个公式来匹配,那么如何才能写一个这样的公式呢?这节课我就给大家说说正则表达式,看起来比较高大上,其实就是通过给定的符号生成一个字符串匹配的公式,通过该公式把需要的数据匹配出来。比如

    • 匹配正确的IP地址
    • 匹配正确的e-mail地址

      正则表达式

      1、正则表达式介绍

      正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。支持正则表达式的程序如:locate |find| vim| grep| sed |awk正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!
    1. [root@manage01 ~]# locate sko
    2. locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录
    3. 使用updatedb生成数据文件
    4. [root@manage01 ~]# updatedb

    2、正则表达式特殊字符

    定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头或结尾或者不锚定的,做模糊匹配。

    定位符 说明
    ^ 锚定开头 ^a 以a开头 默认锚定一个字符
    $ 锚定结尾 a$ 以a结尾 默认锚定一个字符

    测试案例

    1. 1)精确匹配 以a开头c结尾的字符串
    2. [root@zutuanxue ~]# egrep "^ac$" file
    3. ac
    4. 2)模糊匹配 以a开头
    5. [root@zutuanxue ~]# egrep "^a" file
    6. ac
    7. ab
    8. abbc
    9. abcc
    10. aabbcc
    11. abbbc
    12. abbbbbc
    13. acc
    14. abc
    15. asb
    16. aa
    17. a_c
    18. aZc
    19. aAAAAc
    20. a c
    21. abababab
    22. a3c
    23. 3)模糊匹配 以c结尾的字符串
    24. [root@zutuanxue ~]# egrep "c$" file
    25. ac
    26. abbc
    27. abcc
    28. aabbcc
    29. abbbc
    30. abbbbbc
    31. acc
    32. abc
    33. a_c
    34. aZc
    35. aAAAAc
    36. a c
    37. ccc
    38. a3c

    匹配符:匹配字符串

    匹配符 说明
    . 匹配除回车以外的任意一个字符
    ( ) 字符串分组
    [ ] 定义字符类,匹配括号中的一个字符
    [ ^ ] 表示否定括号中出现字符类中的字符,取反。
    \ 转义字符
    |

    测试案例

    1. 1)精确匹配 以a开头c结尾 中间任意 长度为三个字节的字符串
    2. [root@zutuanxue ~]# egrep "^a.c$" file
    3. acc
    4. abc
    5. a_c
    6. aZc
    7. a c
    8. a3c
    9. 2)模糊匹配 以cc结尾的字符串 因为$只能锚定单个字符,如果是一个字符串就需要用()来做定义
    10. [root@zutuanxue ~]# egrep "(cc)$" file
    11. abcc
    12. aabbcc
    13. acc
    14. ccc
    15. 3)精确匹配 以a开头c结尾 中间是a-z,0-9 长度为三个字节的字符串
    16. [root@zutuanxue ~]# egrep "^a[a-z0-9]c$" file
    17. acc
    18. abc
    19. a3c
    20. 4)精确匹配 以a开头c结尾 中间不包含a-z,0-9 长度为三个字节的字符串
    21. [root@zutuanxue ~]# egrep "^a[^a-z0-9]c$" file
    22. a_c
    23. aZc
    24. a c
    25. 5)精确匹配 以e开头f结尾 中间是*号 长度为三个字节的字符串 e*f
    26. [root@zutuanxue ~]# egrep "^e\*f$" file
    27. e*f
    28. 6)精确匹配 以a开头b或c结尾 中间是任意 长度为三个字节的字符串
    29. [root@zutuanxue ~]# egrep "^a.(b|c)$" file
    30. acc
    31. abc
    32. asb
    33. a_c
    34. aZc
    35. a c
    36. a3c

    限定符:对前面的字符或者(字符串)出现的次数做限定说明

    限定符 说明
    * 某个字符之后加星号表示该字符不出现或出现多次 a (ab)
    与星号相似,但略有变化,表示该字符出现一次或不出现
    + 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
    {n,m} 某个字符之后出现,表示该字符最少n次,最多m次
    {m} 正好出现了m次

    测试案例

    1. 1)精确匹配 以a开头 c结尾 中间是有b或者没有b 长度不限的字符串
    2. [root@zutuanxue ~]# egrep "^ab*c$" file
    3. ac
    4. abbc
    5. abbbc
    6. abbbbbc
    7. abc
    8. 2)精确匹配 以a开头 c结尾 中间只出现一次b或者没有b的字符串
    9. [root@zutuanxue ~]# egrep "^ab?c$" file
    10. ac
    11. abc
    12. 3)精确匹配 以a开头 c结尾 中间是有b且至少出现一次 长度不限的字符串
    13. [root@zutuanxue ~]# egrep "^ab+c$" file
    14. abbc
    15. abbbc
    16. abbbbbc
    17. abc
    18. 4)精确匹配 以a开头 c结尾 中间是有b且至少出现两次最多出现四次 长度不限的字符串
    19. [root@zutuanxue ~]# egrep "^ab{2,4}c$" file
    20. abbc
    21. abbbc
    22. 5)精确匹配 以a开头 c结尾 中间是有b且正好出现三次的字符串
    23. [root@zutuanxue ~]# egrep "^ab{3}c$" file
    24. abbbc
    25. 6) 精确匹配 以a开头 c结尾 中间是有b且至少出现一次的字符串
    26. [root@zutuanxue ~]# egrep "^ab{1,}c$" file
    27. abbc
    28. abbbc
    29. abbbbbc
    30. abc

    3、正则表达式POSIX字符

    posix字符一次只匹配一个范围中的一个字节

    特殊字符 说明
    [:alnum:] 匹配任意字母字符0-9 a-z A-Z
    [:alpha:] 匹配任意字母,大写或小写
    [:digit:] 数字 0-9
    [:graph:] 非空字符( 非空格控制字符)
    [:lower:] 小写字符a-z
    [:upper:] 大写字符A-Z
    [:cntrl:] 控制字符
    [:print:] 非空字符( 包括空格)
    [:punct:] 标点符号
    [:blank:] 空格和TAB字符
    [:xdigit:] 16 进制数字
    [:space:] 所有空白字符( 新行、空格、制表符)

    测试案例

    1. 注意[[ ]] 双中括号的意思: 第一个中括号是匹配符[] 匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]
    2. 1)精确匹配 以a开头c结尾 中间a-zA-Z0-9任意字符 长度为三个字节的字符串
    3. [root@zutuanxue ~]# egrep "^a[[:alnum:]]c$" file
    4. acc
    5. abc
    6. aZc
    7. a3c
    8. 2)精确匹配 以a开头c结尾 中间是a-zA-Z任意字符 长度为三个字节的字符串
    9. [root@zutuanxue ~]# egrep "^a[[:alpha:]]c$" file
    10. acc
    11. abc
    12. aZc
    13. 3)精确匹配 以a开头c结尾 中间是0-9任意字符 长度为三个字节的字符串
    14. [root@zutuanxue ~]# egrep "^a[[:digit:]]c$" file
    15. a3c
    16. 4)精确匹配 以a开头c结尾 中间是a-z任意字符 长度为三个字节的字符串
    17. [root@zutuanxue ~]# egrep "^a[[:lower:]]c$" file
    18. acc
    19. abc
    20. 4)精确匹配 以a开头c结尾 中间是A-Z任意字符 长度为三个字节的字符串
    21. [root@zutuanxue ~]# egrep "^a[[:upper:]]c$" file
    22. aZc
    23. 5)精确匹配 以a开头c结尾 中间是非空任意字符 长度为三个字节的字符串
    24. [root@zutuanxue ~]# egrep "^a[[:print:]]c$" file
    25. acc
    26. abc
    27. a_c
    28. aZc
    29. a c
    30. a3c
    31. 6)精确匹配 以a开头c结尾 中间是符号字符 长度为三个字节的字符串
    32. [root@zutuanxue ~]# egrep "^a[[:punct:]]c$" file
    33. a_c
    34. 7)精确匹配 以a开头c结尾 中间是空格或者TAB符字符 长度为三个字节的字符串
    35. [root@zutuanxue ~]# egrep "^a[[:blank:]]c$" file
    36. a c
    37. 类似
    38. [root@zutuanxue ~]# egrep "^a[[:space:]]c$" file
    39. a c
    40. 8)精确匹配 以a开头c结尾 中间是十六进制字符 长度为三个字节的字符串
    41. [root@zutuanxue ~]# egrep "^a[[:xdigit:]]c$" file
    42. acc
    43. abc
    44. a3c

    说明:特殊字符和POSIX字符是两套字符,都可以完成需要的匹配,大家学习的时候最少要记住一套字符并熟练应用。

    4、练习案例

    1. 1、IP匹配公式
    2. grep '^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$' --color ip_base
    3. 2、E-MAIL地址匹配公式
    01-shell脚本介绍-《shell脚本》 系统网络

    01-shell脚本介绍-《shell脚本》

    一、shell脚本是什么二、为什么要学shell,而不是其他计算机语言三、学习这门课程的优势四、学了能干什么五、学习什么内容六、学习的技巧七、成长路径八、学习环
    评论:0   参与:  22