正则表达式和三剑客
正则表达式
和三剑客
  概念相关
    概念解释
      正则表达式就是为了处理大量的字符串而定义的一套规则和方法
      通过定义的这些特殊符号的辅助，系统管理员就可以快速过滤，替换或输出需要的字符串
      Linux 正则表达式一般以行为单位处理的
    使用方式
      正则表达式是一套规则和方法
      正则工作时以单位进行，一次处理一行
      正则表达式化繁为简，提高工作效率
      linux仅受三剑客（sed、awk、grep）支持，其他命令无法使用
    学习要点注意
      正则表达式应用非常广泛，很多编程语言都支持正则表达式，用于处理字符串提取数据
      linux仅受三剑客（sed、awk、grep）支持，其他命令无法使用
      通配符是大部分普通命令都支持的，用于查找文件或目录
      而正则表达式是通过三剑客命令在文件（数据流）中过滤内容的，注意区别
      以及注意字符集，需要设置LC_ALL=C，注意这一点很重要
    字符集设置
      [nodel root /opt/wwww]#grep -Ri 'LC_ALL=C' /etc/init.d/
/etc/init.d/network: LC_ALL=C sed -e "$__sed_discard_ignored_files" \
/etc/init.d/network: LC_ALL=C sort -k 1,1 -k 2n | \
/etc/init.d/network: LC_ALL=C sed 's/ //')
      作用是修改linux的字符集
      locale
        locale命令可以查看本地字符集设置
        linux通过如下变量设置程序运行的不同语言环境，如中文、英文环境
        [nodel root /opt/wwww]#locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
      问题解决
        自定义字符集出错，shell无法识别时
恢复linux的所有的本地化设置，恢复系统到初始化的语言环境
        [root@yuchao-tx-server ~]# export LC_ALL=C
  通配符和正则的区别
    1.从语法上就记住，只有awk、gre、sed才识别正则表达式符号、其他都是通配符
    2.从用法上区分
      表达式操作的是文件、目录名（属于是通配符）
      表达式操作的是文件内容（正则表达式）
    比如如下符号区别
      通配符和正则表达式 都有 * ? [abcd] 符号
      通配符中，都是用来标识任意的字符
如 ls *.log，可以找到a.log b.log ccc.log
      正则中，都是用来表示这些符号前面的字符，出现的次数，如
grep 'a*'
  正则表达式分类
    使用正则表达式的问题是、有两大类正则表达式规范、linux不同的应用程序，会使用不同的正则表达式
      不同的编程语言使用正则（python,java）
      Linux实用工具（sed、awk、grep）
      其他软件使用正则（mysql、nginx）
    正则表达式引擎
      正则表达式是通过正则表达式引擎（regular expression engine）实现
      正则表达式引擎是 一套底层软件，负责解释正则表达式模式并使用这些模式进行文本匹配
      Linux系统两种
形式表达式
        POSIX基础正则表达式（basic regular expression，BRE）引擎
          BRE对应元字符有
^ $ . [ ] *
          其他符号是普通字符
; \
        POSIX扩展正则表达式（extended regular expression，ERE）引擎
          ERE在在BRE基础上，增加了
( ) { } ? + | 等元字符
        转义符
          反斜杠 \
反斜杠用于在元字符前添加，使其成为普通字符
        POSIX（Portable Operating System Interface）是Unix系统的一个设计标准
  实战应用
BRE引擎方式
    关于单引号、双引号
      正则的模式，建议使用双引号
      如果未涉及变量等，用单引号也不影响
    grep与正则
grep是行处理数据
      语法提示
        NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
        传入的pattern（模式是） ，我们可以统称你写的正则是模式
      ^ 尖角符
        语法
写于最左侧，如
^yu 逐行匹配，找到以yu开头的内容
          [nodel root /opt/wwww]#grep -i -n '^m' test.txt
6:My website is http://yuchaoit.cn
8:My qq num is 877348180
        结合grep的参数 -o 只显示一行中匹配出来内容
          [nodel root /opt/wwww]#grep -i -n '^i' test.txt -o
1:I
2:I
4:I
        显示不匹配的行
          grep -v 取反
            -v, --invert-match 显示不匹配的行
-V, --version 显示版本号
          排除空行
[yuchao-linux01 root ~]$grep -vn "^$" chaoge.txt
      $ 美元符
        语法
word$ 匹配以word结尾的行
        取反匹配
          ^
          [nodel root /opt/wwww]#grep -i -n '[^a-z]$' test.txt
1:I am teacher yuchao.
2:I teach linux,python!
        转义符使用
          [nodel root /opt/wwww]#grep -i -n '.$' test.txt
1:I am teacher yuchao.
2:I teach linux,python!
4:I like english
6:My website is http://yuchaoit.cn
7:Our school site is https://apecome.com
8:My qq num is 877348180
10:Good good study , day day up!
          . 有特殊意义
          \ 转义符
          [nodel root /opt/wwww]#grep -i -n '\.$' test.txt
1:I am teacher yuchao.
        ^$ 匹配空行
          [nodel root /opt/wwww]#grep -i -n '^$' test.txt
3:
5:
9:
      单、双引号区别
        单引号、所见即所得，可以用于匹配如标点符号，还原其本义
        双引号、能够识别linux的特殊符号、或变量，需要借助转义符还原字符本义
          [nodel root /opt/rge_test]#grep -iE "!$" test.txt -n
grep -iE "-n" test.txt -n
          使用双引号是有特殊意义的，这个问题如何解释的
        当需要引号嵌套时，一般做法是，双引号，嵌套单引号
    . 点符
      . 匹配除了换行符以外所有的内容、字符+空格，除了换行符。
      [nodel root /opt/wwww]#grep '.' test2.txt
l
u
o
l i n
[nodel root /opt/wwww]#grep '.' test2.txt -on
1:l
2:u
4:o
5:l
5:
5:
5:i
5:
5:
5:n
      . 代表任意一个字符
        y.
y.. 任意2个字符
        .$ 匹配任意字符结尾
          [nodel root /opt/wwww]#grep '.$' test.txt -n
1:I am teacher yuchao.
2:I teach linux,python!
          除了换行符
        . 和转义符
          只想拿到每一行结尾的普通小数点 .，需要对点转义
  BRE引擎下
grep与正则
    \ 转义符
      转义字符，让有特殊意义的字符，现出原形，还原其本义
      空格、换行、tab
        \n 匹配换行符
          Line feed
        \b 匹配单词边界
          boundary 边界
          如我想从字符串中“This is Regex”匹配单独的单词 “is” 正则就要写成 “\bis\b”
          [nodel root /opt/wwww]#grep '\bis\b' test.txt -n
6:My website is http://yuchaoit.cn
7:Our school site is https://apecome.com
8:My qq num is 877348180
        \r 匹配回车符
          return 回车返回
          linux换行符是\n，表示\r+\n 换行且回车，换行且回到下一行的行首
          windows换行符是\r\n，表示回车+换行
        \t 匹配一个横向的制表符
          Tabulation
          \t 匹配一个横向的制表符，等于tab键
        子主题 5
    * 星号
      重复前一个字符0此或n次
      [nodel root /opt/wwww]#grep 'o*' test.txt -n
1:I am teacher yuchao.
2:I teach linux,python!
      .* 符
        .表示任意一个字符，*表示匹配前一个字符0次或多次
        因此放一起，代表匹配每一行所有内容，包括空格，没有空行
          测试发现还是有空行，即是换行符
          [nodel root /opt/wwww]#grep '.*' test.txt -n
1:I am teacher yuchao.
2:I teach linux,python!
3:
4:I like english
5:
      ^.* 符
        语法
^.* 表示以任意多个字符开头的行
        找出任意以字母i开头的行，且以h结尾的行
          [nodel root /opt/wwww]#grep -i '^i.*h$' test.txt -n
4:I like english
      .*$ 符
        以任意多个字符结尾的行
    [ ] 中括号
      [abc] 匹配括号内的小写a、b、c字符
        [a-z]、 [A-Z] 、[a-zA-z]、[0-9]
        组合使用
          [a-zA-Z0-9] 匹配所有数字和字母
      中括号取反
        语法
          [^abc] 排除中括号里的a、b、c ，和单独的^符号，作用是不同的
          [^a-z] 排除小写字母
    { } 花括号（扩展正则）
      a\{n,m\}
        a\{n,m\} 重复字符a，n到m次
          连续重复的结果
        a\{1,3\} 重复字符a，1到3次
        每次最少找出n个8、最多m个8
      grep 默认不认识扩展正则 {}
        办法1
使用转义符 \{\}
        办法2，让grep认识花括号，可以省去转义符
使用egrep命令
或者 grep -E
          [nodel root /opt/wwww]#egrep '8{1,3}' test.txt -n
8:My qq num is 877348180
          [nodel root /opt/wwww]#grep -E '8{1,3}' test.txt -n
8:My qq num is 877348180
[nodel root /opt/wwww]#
      a\{n,\}
        重复a字符至少n次，可以用简写了
      a\{n\}
        重复字符a，正好n次
          子主题 1
      a\{,m\}
        匹配字符a最多m次