扩展正则表达式（ERE）
扩展正则表达式（ERE）
grep与正则
  区别
    基本正则表达式
      属于早期正则表达式，支持一些基本的功能
      与grep、sed命令结合使用
    扩展正则表达式
      后来添加的正则表达式
      和egrep、awk命令结合
  + 加号
    +
重复前一个字符1次或多次
注意和*的区别，*是0次或多次
      匹配一次或者多次0，没有0的行是不会显示的
    [0-9]+
      从文中找出连续的数字，排除字母，特殊符号、空格
    [a-z]+
      找出连续的小写字母、排除大写字母、标点符号、数字
    [A-Za-z0-9]+
      这里添加了+号，就是找的连续的字母数字了、缺少+号则是每次匹配单个字符
    [^A-Za-z0-9]+]
      找出除了数字、大小写字母以外的内容，如空格、标点符号
    *和+的区别
      *是重复0次、重复多次，因此没匹配到的行也过滤出来了
      +是重复1次、多次、因此至少匹配到1次才看到
  go*d和go+d和go?d区别
    go*d 可以有0个或者n个字母o
go*d 可以找到god、good、gd、gooooooooood
    go+d 可以有一个或n个字母o
go+d 可以找到god、good、gooooooooood
    go?d 可以有0个或者1个字母0
go?d 可以找到gd、god
  | 或者符
    竖线在正则里是或者的意思
    [nodel root /opt/wwww]#free -m e|grep -iE 'mem|swap'
Mem: 3773 564 2371 12 837 2863
Swap: 2047 0 2047
      grep 加E
      egrep
    找出文件中的空行以及注释行
      [nodel root /opt/wwww]#grep -E -i '^#|^$' test.txt -n
  ( ) 括号、分组符
    语法
      () 作用是将一个或者多个字符捆绑在一起，当做一个整体进行处理
      小括号功能之一是分组过滤被括起来的内容，括号内的内容表示一个整体
      括号()内的内容可以被后面的"\n"正则引用，n为数字，表示引用第几个括号的内容
        \1：表示从左侧起，第一个括号中的模式所匹配到的字符
        \2：从左侧起，第二个括号中的模式所匹配到的字符
    仅仅匹配出glad和good
      grep -iE "g(la|oo)d" god.log
      [nodel root /opt/rge_test]#grep -iE 'g(la|oo)d' god.log
I am God, I need you to good good study and day day up, otherwise I will send you to see Gd,oh sorry, gooooooooood!
I am glad to see you, god,you are a good god!
    分组与向后引用
      分组过滤，被括起来的内容表示一个整体，另外()的内容可以被后面的\n引用，n为数字，表示引用第几个括号的内容
      \n
引用前面()里的内容，例如(abc)\1 表示匹配abcabc
      实战演练
        提取love出现2次的行
        [nodel root /opt/rge_test]#grep -iE '(l..e).*\1' lovers.log
I love my lover.
He love his lovers.
    提取/etc/passwd
      找出系统中几个特殊shell、专门用来开机，关机的用户
      [nodel root /opt/wwww]#grep -iE '^([^:]+\b).*\1$' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[nodel root /opt/wwww]#
  BRE语法
    \(regexp\) 分组，将 \( 和 \) 之间的内容视为一个整体，有两个作用
      配合前面的 * \{m,n\} 等量词使用，例如： ab\{2\} 匹配“abb”, 而 \(ab\)\{2\} 匹配“abab”
      向后引用（back references），使用 \1 ~ \9 来引用第1~9个分组匹配的内容
      例如： \(ab*\)\1 可以匹配“abab”，也能匹配“abbbabbb”
    GNU扩展的BRE
      实际上现代Linux发行版中使用的 grep sed awk 等工具均由GNU提供
      GNU在实现时对BRE进行了扩展，增加了 \? \+ \| 使得BRE和ERE的区别仅剩元字符是否需要转义
      BRE现在存在的主要意义还是向下兼容，避免修改已经投入使用的正则表达式
    正则官网讲解
      https://www.regular-expressions.info/posix.html
      https://www.regular-expressions.info/posixbrackets.html
      https://www.gnu.org/software/sed/manual/html_node/BRE-syntax.html#BRE-syntax
  ERE语法
    ERE和BRE的最显著的区别是ERE中所有元字符（metacharacters）均不需要使用 \ 进行转义
    即用 {m,n} 替代 \{m,n\} , (regexp) 替代 \(regexp\) （当然分组向后引用依旧是 \1 ~ \9）
    增加了以下语法
      ? 前面的字符或模式重复0或1次
      + 前面的字符或模式重复1次及以上
      |，regexp1|regexp2匹配regexp1或regexp2
    总结grep
      egrep被淘汰，使用grep -E
      可以是用grep -o参数，查看每次匹配的结果
      正则需要在练习中理解其含义，无法死记硬背
      后面结合sed、awk发挥更多正则作用
  在线测试正则的网站
    https://deerchao.cn/tools/wegester/
  分支主题 9