zoukankan      html  css  js  c++  java
  • Shell 正则表达式详解

    Shell 正则表达式

    什么是正则表达式?

    正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串。

    为什么要学正则表达式?

    在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符合工作需要的特定的字符串。这就要靠正则表达式。因此,可以说正则表达式就是为过滤字符的需求而生的!
    例如:ifconfig的输出取IP,例如:cat /var/log/messages输出等

    两个注意事项:

    1. 正则表达式应用非常广泛,存在于各种语言中,例如:php、python、java等。但是我们今天讲的linux系统运维工作中的正则表达式,即linux正则表达式,最常用正则表达式的命令就是grep(egrep)、sed、awk,换句话说linux四剑客剑客要想工作的各高效,那一定离不开正则表达式配合的。
    2. 正则表达式和我们常用的通配符特殊字符是用本质去别的,这一点要注意。通配符例子:ls .log**这里的就是通配符(表示所有),不是正则表达式

    Shell 正则表达式分为两种:

    • 基础正则表达式:BRE(basic regular express)
    • 扩展正则表达式:ERE(extend regular express),扩展的表达式有+、?、|和()

    下面是一些常用的正则表达式符号

    正则表达式 描述
    转义符,将特殊字符进行转义,忽略其特殊意义
    ^ 匹配行首,awk中,^则是匹配字符串的开始
    $ 匹配行尾,awk中,$则是匹配字符串的结尾
    . 匹配除换行符 之外的任意单个字符,awk则中可以
    [] 匹配包含在[字符]之中的任意一个字符
    [^ ] 匹配[^字符]之外的任意一个字符
    [] 匹配不是中括号内任意一个字符开头的行
    [ - ] 匹配[]中指定范围内的任意一个字符,要写成递增
    ? 匹配之前的项1次或者0次
    + 匹配之前的项1次或者多次
    * 匹配之前的项0次或者多次
    () 匹配表达式,创建一个用于匹配的子串
    { n } 匹配之前的项n次,n是可以为0的正整数
    {n,} 之前的项至少需要匹配n次
    {n,m} 指定之前的项至少匹配n次,最多匹配m次,n<=m
    | 交替匹配|两边的任意一项
    < 边界符,匹配字符串开始
    > 边界符,匹配字符串结束

    基本正则表达式实践

    接下来的测试文本如下:

    [root@localhost ~]# cat test.log 
    %anaconda
    pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges –notempty
    pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges –emptyok
    pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
    
    %end...
    =========================
    
    

    以下实践通过grep 命令增加正则表达式进行匹配练习

    1. ^(尖角号)功能实践
    # 匹配首字母为%的行
    [root@localhost ~]#  grep -n "^%" test.log 
    # -n 参数是显示匹配到的行号。
    
    

    1570716106386

    1. $(美元符)功能实践
    #匹配结尾字符为y的所在行
    [root@localhost ~]# grep -n "y$" test.log 
    
    

    1570716156583

    1. ^$ 功能实践
    #匹配所有的空行进行显示
    [root@localhost ~]# grep -n "^$" test.log 
    
    
    

    1570716182783

    1. (点)功能实践
    #匹配任意单个字符进行显示(排除空行)
    [root@localhost ~]# grep -n "." test.log 
    
    

    1570716218056

    1. (转义符)功能实践

    #将特殊字符进行转义,忽略其特殊意义

    1570716237463

    1. *(星号)功能实践

    #匹配任意的项0次或者多次

    1570716255958

    1. .*组合符功能实践

    .* 组合在一起使用可以匹配任意字符串

    1570716277103

    #匹配任意以o开头的行

    1570716339064

    1. [](中括号)功能实践

    #匹配到任意包含a-z 字母的字符

    1570716370155

    1. [^abc](中括号内取反符)功能实践

    #匹配取反字符,将^放在括号内代表取反的意思

    1570716393582

    扩展正则表达式实践

    1. +(加号)功能实践

    #匹配之前+号之前的字符1次或者多次

    1570782299517

    1. ?(问号)功能实践

    #匹配之前?号之前的字符1次或者0次

    1570782308374

    1. |(竖线)功能实践

    #竖线匹配可以进行多个值的选定

    1570782322885

    1. () 功能实践

    要求:取出包含good或glad的行

    1570782405525

    #后向引用,后项引用主要用作于匹配分组调换顺序的时候进行使用,1 表示调用前面第一个括号里面的内容,2 代表调用第2个括号里面的内容,最多能引用九个括号,也就是说支持从 1 - 9。

    1570782420917

    1. {n,m}匹配次数功能实践

    #单独使用一个大括号,可以引用前面的字符一次到多次

    1570782435217

    1. < >边界符锚定

    #边界符可以用固定字符的匹配

    <:其后面的字符必须作为单词的首部出现

    >:其前的字符必须作为单词的尾部出现

    <root<:root必须作为一行的单词出现

    1570782493490

    在Shell下使用这些正则表达式处理文本最多的命令有下面几个工具:

    命令 描述
    grep 默认不支持扩展表达式,加-E选项开启ERE。如果不加-E使用花括号要加转义符{}
    egrep 支持基础和扩展表达式
    awk 支持egrep所有的正则表达式
    sed 默认不支持扩展表达式,加-r选项开启ERE。如果不加-r使用花括号要加转义符{}
  • 相关阅读:
    导入已有项目到svn
    Linux用ICMP协议实现简单Ping网络监测功能
    c++ tcp 服务器和客户端例子
    C++ Socket 编程
    c++工厂模式和多线程结合
    Linux中ls命令详解
    Mac OS X 11中的/usr/bin 的“Operation not permitted”
    Warning: mysql_connect(): No such file or directory 解决方案总结(操作系统: Mac)
    页面组件渲染小组件(重点)
    Vue 路由
  • 原文地址:https://www.cnblogs.com/Serverlessops/p/11664218.html
Copyright © 2011-2022 走看看