---
url: /notes/linux/正则表达式/index.md
---
# 正则表达式

```PowerShell
一、了解：通配符(bash程序自身的一个特殊语句)
    ★ 通配符 是一种特殊语句，用来模糊搜索文件。
    ## ★ *   表示：0或多个的<任意字符>
    ## ★ ?   表示：单个<任意字符>
    ## ★ []  表示：匹配<字符列表或范围>中的<单个字符>
    ##             [xyz]   设置：可选的<字符列表>
    ##             [x-z]   设置：可选的<字符范围>
    ##             [^xyz]  表示：不选择x、y、z
    ##                     　　　^ 表示<不匹配>，^ 必须是第一个字符
    ## ★ 举例
         rm -rf /tmp/*
         touch /tmp/{a,b,c,d,e}.txt
         ls -l /tmp/[abc].txt  ##   列出：a.txt b.txt c.txt
         ls -l /tmp/[a-e].txt  ##   列出：a.txt b.txt c.txt d.txt e.txt
         ls -l /tmp/[^abc].txt ## 不列出：a.txt b.txt c.txt

二、简单了解：正则表达式
    ★ 通配符 不是 正则表达式
    ★ 正则表达式：描述了一种字符串的<匹配模式(pattern)>
                  比如：
                       echo "aabbcc" | grep -o "a"
                       echo "abbaaccaaa" | grep -o -E "a{2}[^a]+" | grep -o "aa"
    ★ 了解：正则表达式的组成
            1. 普通的字符
            2. 特殊的字符(元字符)
    ★ 了解：正则表达式的类型
            1. 基本正则
            2. 扩展正则(最常用)，grep -E 调用<扩展正则>
            3. Perl正则        ，grep -P 调用<Perl正则>
    ★ 了解：元字符
            元字符　特殊含义                           基本正则　扩展正则  Perl/Python正则
            ^       行首                               yes       yes       yes
            $       行尾                               yes       yes       yes
            .       任意单个字符                       yes       yes       yes
            ?       前面一个字符，可以出现0次或1次     no        yes       yes
            +       前面一个字符，可以出现1次或多次    no        yes       yes
            *       前面一个字符，可以出现0次或多次    yes       yes       yes
            []      匹配：<字符列表>中的<任意一个字符> yes       yes       yes
                    [abc]
                    [0-9a-zA-Z]
                    [^abc]
            ()      分组，每一个分组就是一个<项>       no        yes       yes
            |       逻辑或                             no        yes       yes
            {n}     匹配：<前一项>出现<ｎ次>           no        yes       yes
            {n,}    匹配：<前一项>出现<ｎ次 ~ 多次>    no        yes       yes
            {n,m}   匹配：<前一项>出现<ｎ次 ~ m次>     no        yes       yes
            ##################################################################
            \d      匹配：任意单个数字                 no        no        yes        
            \D      配置：任意单个非数字               no        no        yes
            \s      配置：貌似空格的空格               yes       yes       yes
            \S      匹配：单个<非空白字符>             yes       yes       yes
            \w      匹配：单个<单词的字符>             yes       yes       yes
                          如:字母、数字、_下划线
            \W      匹配：单个<非单词的字符>           yes       yes       yes
    ★ 了解：\转义符
         功能：还原<字符>的<原义>
         举例：
              <正则表达式>中的 . 是一个<元字符>，具备<特殊含义>
              如果需要匹配<字符串>中的 . ，就必须进行转义： \.
    ★ 举例：
      ## 过滤出：httpd.conf配置文件中的<ServerName指令值>，不要显示<注释行中的ServerName>
         yum install -y httpd
         vi /etc/httpd/conf/httpd.conf
            ## 通过 /ServerName 搜索定位到 ServerName 这一行，添加：
            ServerName server01:80
            ## :wq 保存退出

         cat /etc/httpd/conf/httpd.conf | "^\s*[Ss]erver[Nn]ame"
      ## 过滤出：网卡中的<网关和DNS信息行>
         env LANG=us nmcli connection show ens33 | grep -E "^IP4\.(GATEWAY|DNS)"

      ## 过滤出：httpd.conf配置文件中的<非注释行>
         cat /etc/httpd/conf/httpd.conf | grep  -vE "^\s*($|#)"

      ## 获取：网卡的IPv4地址
         ip addr show ens33 | grep -o -P "(\d+\.?){4}/\d+"

      ## 获取：网卡的IPv6地址
         ip addr show ens33 | grep -o -P "([0-9a-f]*:?){6}/64"
```
