• 正则表达式 2020年11月10日19:07:35


    Linux正则表达式

    image-20191106101524791

    正则表达式:Regual Expression, REGEXP

    由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;

    分两类:

    基本正则表达式:BRE
    扩展正则表达式:ERE

    正则表达式的意义

    • 处理大量的字符串
    • 处理文本

    通过特殊符号的辅助,可以让linux管理员快速过滤、替换、处理所需要的字符串、文本,让工作高效。

    通常Linux运维工作,都是面临大量带有字符串的内容,如

    • 配置文件
    • 程序代码
    • 命令输出结果
    • 日志文件

    且此类字符串内容,我们常会有特定的需要,查找出符合工作需要的特定的字符串,因此正则表达式就出现了

    • 正则表达式是一套规则和方法
    • 正则工作时以单位进行,一次处理一行
    • 正则表达式化繁为简,提高工作效率
    • linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用

    正则表达式应用非常广泛,应用在如Python、Java、Perl等,Linux下普通命令无法使用正则表达式的,只能使用三剑客。

    通配符是大部分普通命令都支持的,用于查找文件或目录,而正则表达式是通过三剑客命令在文件(数据流)中过滤内容的

    Linux三剑客

    文本处理工具,均支持正则表达式引擎

    • grep:文本过滤工具,(模式:pattern)工具
    • sed:stream editor,流编辑器;文本编辑工具
    • awk:Linux的文本报告生成器(格式化文本),Linux上是gawk

    正则表达式的分类

    Linux三剑客主要分两类

    • 基本正则表达式(BRE、basic regular expression)
    BRE对应元字符有 ^$.[]*
    
    • 扩展正则表达式(ERE、extended regular expression)
    ERE在在BRE基础上,增加上 (){}?+| 等字符
    

    基本正则表达式BRE集合

    • 匹配字符
    • 匹配次数
    • 位置锚定
    符号作用
    ^ 尖角号,用于模式的最左侧,如 "^oldboy",匹配以oldboy单词开头的行
    $ 美元符,用于模式的最右侧,如"oldboy$",表示以oldboy单词结尾的行
    ^$ 组合符,表示空行
    . 匹配任意一个且只有一个字符,不能匹配空行
    转义字符,让特殊含义的字符,现出原形,还原本意,例如.代表小数点
    * 匹配前一个字符(连续出现)0次或1次以上 ,重复0次代表空,即匹配所有内容
    .* 组合符,匹配任意长度的任意字符
    ^.* 组合符,匹配任意多个字符开头的内容
    .*$ 组合符,匹配以任意多个字符结尾的内容
    [abc] 匹配[]集合内的任意一个字符,a或b或c,可以写[a-c]
    [^abc] 匹配除了^后面的任意字符,a或b或c,^表示对[abc]的取反
    <pattern> 匹配完整的内容
    <或> 定位单词的左侧,和右侧,如<chao>可以找出"The chao ge",缺找不出"yuchao"

    扩展正则表达式ERE集合

    扩展正则必须用 grep -E 才能生效

    字符作用
    + 匹配前一个字符1次或多次,前面字符至少出现1次
    [:/]+ 匹配括号内的":"或者"/"字符1次或多次
    ? 匹配前一个字符0次或1次,前面字符可有可无
    竖线 表示或者,同时过滤多个字符串
    () 分组过滤,被括起来的内容表示一个整体
       
    a{n,m} 匹配前一个字符最少n次,最多m次
    a{n,} 匹配前一个字符最少n次
    a{n} 匹配前一个字符正好n次
    a{,m} 匹配前一个字符最多m次

    Tip:

    grep命令需要使用参数 -E即可支持正则表达式
    egrep不推荐使用,使用grep -E替代
    grep不加参数,得在特殊字符前面加""反斜杠,识别为正则

    grep

    全拼:Global search REgular expression and Print out the line.

    作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行

    模式:由正则表达式的元字符文本字符所编写出的过滤条件

    语法:
    grep [options] [pattern]  file 
    命令  参数   匹配模式   文件数据
                    -i:ignorecase,忽略字符的大小写;
                    -o:仅显示匹配到的字符串本身;
                    -v, --invert-match:显示不能被模式匹配到的行;
                    -E:支持使用扩展的正则表达式元字符;
                    -q, --quiet, --silent:静默模式,即不输出任何信息;

    grep命令是Linux系统中最重要的命令之一,功能是从文本文件管道数据流中筛选匹配的数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令

    grep命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式

    参数选项解释说明
    -v 排除匹配结果
    -n 显示匹配行与行号
    -i 不区分大小写
    -c 只统计匹配的行数
    -E 使用egrep命令
    --color=auto 为grep过滤结果添加颜色
    -w 只匹配过滤的单词
    -o 只输出匹配的内容

    案例

    cat /etc/passwd > /tmp/test_grep.txt
    
    grep  "login" /tmp/test_grep.txt  -n                                #找出login有关行
    grep  "login" /tmp/test_grep.txt  -n -v                                 #找出没有login的行
    grep   "ROOT" /tmp/test_grep.txt  -i                                      #忽略大小写,找出root有关行
    grep -E  "root|sync"  /tmp/test_grep.txt --color=auto       #同时过滤出root和sync有关行
    grep "login" /tmp/test_grep.txt  -c                 #统计匹配结果的行数
    grep "login" /tmp/test_grep.txt   -n -o                   #只输出匹配出的内容
    
    grep "oldboy" /tmp/test_grep.txt -w                         #完整匹配,字符串精确匹配,整个单词
    grep -Ev "^#|^$"  /tmp/test_grep.txt                       #过滤掉空白和注释行

    正则表达式grep实践

    准备测试文件

    image-20191106154442687

    ^符号

    1.输出所有以m开头的行

    [root@pylinux data]# grep -i  -n "^m" luffy.txt        # -i忽略大小写  -n 显示仪行号
    5:My qq is 877348180.
    7:My name is chaoge.

    image-20191106154522834

    2.输出所有以i开头的行

    [root@pylinux data]# grep -i -n "^i" luffy.txt
    1:I am oldboy teacher
    2:I teach linux.
    3:I like python.

    image-20191106154535049

    $符

    1.输出所有以r结尾的行

    [root@pylinux data]# grep -i -n "r$" luffy.txt
    1:I am oldboy teacher

    image-20191106154550687

    2.输出所以以m结尾的行

    [root@pylinux data]# grep -i -n "m$" luffy.txt
    9:Our school website is http://oldboyedu.com

    image-20191106154603756

    TIP

    注意在Linux平台下,所有文件的结尾都有一个$符
    可以用cat -A 查看文件

    3.输出所有以"."结尾的行,注意用转义符

    1.注意不加转义符的结果,正则里"."是匹配任意1个字符,grep把.当做正则处理了,因此把有数据的行找出来了,
    
    [root@pylinux data]# grep -i -n ".$" luffy.txt
    1:I am oldboy teacher
    2:I teach linux.
    3:I like python.
    5:My qq is 877348180.
    7:My name is chaoge.
    9:Our school website is http://oldboyedu.com
    
    
    2.加上转义符,当做普通的小数点过滤
    [root@pylinux data]# grep -i -n ".$" luffy.txt
    2:I teach linux.
    3:I like python.
    5:My qq is 877348180.
    7:My name is chaoge.

    image-20191106154626226

    ^$组合符

    1.找出文件的空行,以及行号
    [root@pylinux data]# grep "^$" luffy.txt  -n
    4:
    6:
    8:
    10:
    11:
    12:

    image-20191106154654427

    .点符号

    "."点表示任意一个字符,有且只有一个,不包含空行

    [root@pylinux data]# grep -i -n "." luffy.txt
    1:I am oldboy teacher
    2:I teach linux.
    3:I like python.
    5:My qq is 877348180.
    7:My name is chaoge.
    9:Our school website is http://oldboyedu.com

    image-20191106154706558

    匹配出 ".ac",找出任意一个三位字符,包含ac

    [root@pylinux data]# grep -i -n ".ac" luffy.txt
    1:I am oldboy teacher
    2:I teach linux.

    image-20191106154719560

    转义符

    1.找出文中所有的点"."

    [root@pylinux data]# grep "." luffy.txt
    I teach linux.
    I like python.
    My qq is 877348180.
    My name is chaoge.
    Our school website is http://oldboyedu.com

    image-20191106154811677

    *符

    1.找出前一个字符0次或多次,找出文中出现"i"的0次或多次

    [root@pylinux data]# grep -n "i*" luffy.txt
    1:I am oldboy teacher
    2:I teach linux.
    3:I like python.
    4:
    5:My qq is 877348180.
    6:
    7:My name is chaoge.
    8:
    9:Our school website is http://oldboyedu.com
    10:
    11:
    12:

    image-20191106154826189

    .*组合符

    .表示任意一个字符,*表示匹配前一个字符0次或多次,因此放一起,代表匹配所有内容,以及空格

    [root@pylinux data]# grep '.*' luffy.txt
    I am oldboy teacher
    I teach linux.
    I like python.
    
    My qq is 877348180.
    
    My name is chaoge.
    
    Our school website is http://oldboyedu.com

    image-20191106154909663

    ^.*o符

    ^以某字符为开头

    .任意0或多个字符

    .*代表匹配所有内容

    o普通字符,一直到字母o结束

    这种匹配相同字符到最后一个字符的特点,称之为贪婪匹配

    [root@chaogelinux data]# grep "I.*o" luffy.txt
    I am oldboy teacher
    I like python.

    [abc]中括号

    中括号表达式,[abc]表示匹配中括号中任意一个字符,a或b或c,常见形式如下

    • [a-z]匹配所有小写单个字母
    • [A-Z]匹配所有单个大写字母
    • [a-zA-Z]匹配所有的单个大小写字母
    • [0-9]匹配所有单个数字
    • [a-zA-Z0-9]匹配所有数字和字母
    [root@pylinux data]# grep '[a-z]' luffy.txt
    I am oldboy teacher
    I teach linux.
    I like python.
    My qq is 877348180.
    My name is chaoge.
    Our school website is http://oldboyedu.com

    image-20191106155012826

    [root@pylinux data]# grep '[abcd]' luffy.txt
    I am oldboy teacher
    I teach linux.
    My name is chaoge.
    Our school website is http://oldboyedu.com

    image-20191106155050280

  • 相关阅读:
    redis liunx安装
    db2实现每条数据累加
    js实现目录链接,内容跟着目录滚动显示
    Anaconda3安装过程中遇到“Anaconda3-5.1.0-Linux-x86_64.sh:行350: bunzip2: 未找到命令 tar: 它似乎不像是一个 tar 归档文件 tar: 由于前次错误,将以上次的错误状态退出”
    java axis2生成wsdl
    java axis2解析xml(wsdl返回List数据Map<String,Object>
    java axis2解析xml(wsdl返回List数据Map<String,String>
    java axis2解析xml(wsdl返回List数据)
    jquery 合并单元格,rowspan
    poi导出excel
  • 原文地址:https://www.cnblogs.com/ch2020/p/13956843.html
Copyright © 2020-2023  润新知