zoukankan      html  css  js  c++  java
  • Linux正则表达式

    一、Linux文本查找命令

    在说Linux正则表达式之前,有一点需要提前说明,在Linux下查找文本文件常用的有三个命令:

    1.grep:最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。

    2.egrep:扩展grep,其使用扩展正则表达式(ERE)来匹配文件。

    3.fgrep:快速grep,这个版本匹配固定字符串而非正则表达式,是唯一可以并行匹配多个字符串的版本。

    需要说明的是,在最新的版本中egrep和fgreo都不能再直接使用,使用grep -E和grep -F替换。

    使用grep --help可以查询grep的详细信息:

    正则表达式选择与解释:
      -E, --extended-regexp     PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
      -F, --fixed-strings       PATTERN 是一组由断行符分隔的定长字符串。
      -G, --basic-regexp        PATTERN 是一个基本正则表达式(缩写为 BRE)
      -P, --perl-regexp         PATTERN 是一个 Perl 正则表达式
      -e, --regexp=PATTERN      用 PATTERN 来进行匹配操作
      -f, --file=FILE           从 FILE 中取得 PATTERN
      -i, --ignore-case         忽略大小写
      -w, --word-regexp         强制 PATTERN 仅完全匹配字词
      -x, --line-regexp         强制 PATTERN 仅完全匹配一行
      -z, --null-data           一个 0 字节的数据行,但不是空行
    
    Miscellaneous(其它的选项):
      -s, --no-messages         suppress error messages消除错误信息
      -v, --invert-match        select non-matching lines选择非匹配的行,也就是取反
      -V, --version             display version information and exit版本信息
          --help                display this help text and exit
    
    输出控制:
      -m, --max-count=NUM       NUM 次匹配后停止
      -b, --byte-offset         输出的同时打印字节偏移
      -n, --line-number         输出的同时打印行号
          --line-buffered       每行输出清空
      -H, --with-filename       为每一匹配项打印文件名
      -h, --no-filename         输出时不显示文件名前缀
          --label=LABEL         将LABEL 作为标准输入文件名前缀
      -o, --only-matching       show only the part of a line matching PATTERN只显示部分结果
      -q, --quiet, --silent     suppress all normal output禁止所有正常输出
          --binary-files=TYPE   assume that binary files are TYPE;假设需要匹配的是二进制文件
                                TYPE is 'binary', 'text', or 'without-match'
      -a, --text                equivalent to --binary-files=text  等价于 二进制文件=文本
      -I                        equivalent to --binary-files=without-match  等价于 二进制文件=没有匹配到的
      -d, --directories=ACTION  how to handle directories;  如何处理目录:读、递归、跳过
                                ACTION is 'read', 'recurse', or 'skip'
      -D, --devices=ACTION      how to handle devices, FIFOs and sockets;如何处理设备、先入先出队列和套接字
                                ACTION is 'read' or 'skip'读或者跳过
      -r, --recursive           like --directories=recurse  递归
      -R, --dereference-recursive  引用递归
                                likewise, but follow all symlinks
          --include=FILE_PATTERN包含文件模式
                                search only files that match FILE_PATTERN 只查找文件
          --exclude=FILE_PATTERN不包含文件模式
                                skip files and directories matching FILE_PATTERN
          --exclude-from=FILE   skip files matching any file pattern from FILE
          --exclude-dir=PATTERN directories that match PATTERN will be skipped.匹配的目录将被跳过
      -L, --files-without-match print only names of FILEs containing no match只打印不匹配的文件名
      -l, --files-with-matches  print only names of FILEs containing matches  打印匹配的文件名
      -c, --count               print only a count of matching lines per FILE 打印匹配到的每个文件的行数
      -T, --initial-tab         make tabs line up (if needed)  如果需要的话制表符对齐
      -Z, --null                print 0 byte after FILE name  文件名后面不打印文件
    
    文件控制:
      -B, --before-context=NUM  打印以文本起始的NUM 行
      -A, --after-context=NUM   打印以文本结尾的NUM 行
      -C, --context=NUM         打印输出文本NUM 行
      -NUM                      same as --context=NUM
          --group-separator=SEP use SEP as a group separator 使用sep作为分离器
          --no-group-separator  use empty string as a group separator
          --color[=WHEN],
          --colour[=WHEN]       use markers to highlight the matching strings;
                                WHEN is 'always', 'never', or 'auto'
      -U, --binary              do not strip CR characters at EOL (MSDOS/Windows)
      -u, --unix-byte-offsets   report offsets as if CRs were not there
                                (MSDOS/Windows)
    
    ‘egrep’即‘grep -E’。‘fgrep’即‘grep -F’。
    直接使用‘egrep’或是‘fgrep’均已不可行了。
    若FILE 为 -,将读取标准输入。不带FILE,读取当前目录,除非命令行中指定了-r 选项。
    如果少于两个FILE 参数,就要默认使用-h 参数。
    如果有任意行被匹配,那退出状态为 0,否则为 1;
    如果有错误产生,且未指定 -q 参数,那退出状态为 2

    二、正则表达式

    1.正则表达式的组成

    (1)一般字符:没有特殊意义的字符

    (2)特殊字符(meta字符):元字符,在正则表达式中有特殊意义

    2.元字符介绍

    (1)BRE和ERE(grep -E)通用的meta字符

    meta字符 功能
    通常用于打开或关闭后续字符的特殊含义,如(...)
    . 匹配任意单个字符(除NULL)
    * 匹配前面的任何数目或没有的单个字符,例如.*匹配任意字符的任意长度
    ^ 匹配以什么开头的字符
    $ 匹配以什么结尾的字符
    [] 匹配括号内的任意字符,使用连接符(-)表示范围,(^)表示取反

    (2)BRE(grep)才能用的元字符

    meta字符 功能
    {n,m} 区间表达式,匹配它前面的单个字符重现的次数,{n}重现n次,{ ,m}重现n到m次
    () 保留空间,可以将最多9个独立的子模式存储在单个模式中,将括号内的当作一个整体
    重复在(与)方括号内第n个子模式至此点的模式

    (3)ERE(grep -E)才能用的元字符

    meta字符 功能
    {n,m} 进行次数限制,与BRE的{n,m}功能相同,并不是把某个字段查找出来
    + 匹配前面的一个或多个
    匹配前面的一个或多个
    | 匹配|符号前面或后面的正则表达式,逻辑或
    () 匹配方括号括起来的正则表达式群

    比较:

    #{n,m}与{
    ,m}比较
    [root@chenxing2 tmp]# grep -E"e{1,3}" 2.txt 
    qweoooewwooaaaaoaaaafaweee
    eeeababyyyyyyyyy
    eeeabababuuu
    [root@chenxing2 tmp]# grep "e{1,3}" 2.txt 
    qweoooewwooaaaaoaaaafaweee
    eeeababyyyyyyyyy
    eeeabababuuu

    (4)字符集

    标识字符集有如下方法:

    [::alnum] : 数字字符 [:digit:] : 数字字符
    [:punct:] : 标点符号字符 [:alpha:] : 字母字符
    [:graph:] : 非空格字符 [:space:] : 空格字符
    [:blank:] : 空格与定位字符 [:lower:] : 小写字母字符
    [:upper:] : 大写字母字符 [:cntrl:] : 控制字符
    [:print:] : 可显示的字符 [:xdigit:] : 16进制数字

    三、实例

    如下通过常用实例来学习BRE和ERE匹配,源文件url.txt内容如下:

    www.baidu.com
    http://www.baidu.com
    https://www.baidu.com
    http://wwwbaiducom
    baidu.com
    baidu

    1.url匹配

    匹配以http或者https开头,并且其后为:并且含有.的串

    BRE匹配:

    grep '^https{0,1}.*..*' url.txt

    ERE匹配:

    grep -E '^https?.*..*' url.txt

    匹配结果如下:

    http://www.baidu.com
    https://www.baidu.com

    2.Email匹配

    示例文件内容为:

    hfutwyy@qq.com
    aaaa@
    aaa@.com
    aaa@gmail.com
    @@baidu.com

    匹配以字母数字或者下划线开头的多个字符,其后有一个@之后有多个字母数字或者下划线,其中有一个.号

    grep '^[[:alpha:][:digit:]_]*@[[:alpha:][:digit:]]*..*' email.txt

     匹配结果:

    hfutwyy@qq.com
    aaa@.com
    aaa@gmail.com
  • 相关阅读:
    关于zabbix 的lld的web界面的配置
    fastdfs+nginx的安装部署
    mybatis 模糊查询写法
    mybatis-generator:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver
    mybatis判断不为空,不为null等
    mybatis错误:Parameter 'companyName' not found. Available parameters are [arg3, arg2, arg1, arg0,..]
    oracle数据库 ORA-01810: 格式代码出现两次
    Shell学习(一)
    本地计算机上的OracleOraDb11g_home1TNSListener服务启动后停止
    net share c$=c: 发生系统错误
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/8436902.html
Copyright © 2011-2022 走看看