linux正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux正则表达式相关的知识,希望对你有一定的参考价值。

linux正则表达式

grep : 最早的文本匹配程序,基本正则表达式(BRE)来匹配文本。
egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。
fgrep : 快速grep,这个版本匹配固定字符串而非正则表达式。(不支持正则表达式搜索) 

一、linux文本查找命令

** 对grep命令的介绍**

    作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行 
    模式:由正则表达式字符及文本字符所编写的过滤条件 

**grep 命令**

    语法:grep [选项] (参数)
    选项:
        grep --color=auto :对匹配到的文本着色显示(CentOS7里默认显示)
        grep -v     #   反向搜索
        grep -i    #   忽略大小写
        grep -n   #   显示匹配的行号
        grep -c     #   统计匹配的行数,不显示搜索结果
        grep -o     #   仅显示匹配到的字符串
        grep -q     #   静默 (不显示结果)
                             echo $?     # 显示命令执行结果,正确为0,错误不为0
        grep -A   #     显示搜索行及其向下相邻的#行
        grep -B   #     显示搜索行及其向上相邻的#行
        grep -C   #   显示搜索行及其向上下相邻的#行
        grep -e     #     支持多个选项间
                                grep -e ‘root’ -e ‘bin’ /etc/passwd  #多个选项间or关系
        grep -w     #     匹配整个单词
        grep -E     #   或egrep 支持扩展正则表达式
        grep -F     #   或fgrep 不支持扩展正则表达式

二、正则表达式介绍

正则表达式(REGEXP):由一类特殊字符及文本字符所编写的模式,其中有 些字符(元字符)不表示字符字面意义,而表示控制或通配 的功能 
程序支持:grep,sed,awk,vim, less,nginx,varnish等 
    分两类: 
        基本正则表达式:BRE 
        扩展正则表达式:ERE 
            grep -E, egrep 
正则表达式引擎: 
    采用不同算法,检查处理正则表达式的软件模块 PCRE(Perl Compatible Regular Expressions)  
元字符分类:字符匹配、匹配次数、位置锚定、分组 
man  7 regex

基本正则表达式元字符

字符匹配:

        .   匹配任意单个字符 
        ( ) : 匹配方括号括起来的正则表达式群
        []  匹配指定范围内的任意单个字符,其中可用连字符(-)指的连续字符的范围 
        [^] 匹配指定范围外的任意单个字符 
        [:alnum:] 字母和数字 
        [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z 
        [:lower:] 小写字母 
        [:upper:] 大写字母 
        [:blank:] 空白字符(空格和制表符) 
        [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广) 
        [:cntrl:] 不可打印的控制字符(退格、删除、警铃...) 
        [:digit:] 十进制数字 
        [:xdigit:]十六进制数字 
        [:graph:] 可打印的非空白字符 
        [:print:] 可打印字符 
        [:punct:] 标点符号

匹配次数: 用在要指定次数的字符后面,用于指定前面的字 符要出现的次数 

        * 匹配前面的字符任意次,包括0次 (贪婪模式:尽可能长的匹配 )
        .* 任意长度的任意字符
        \ 通常用于打开或关闭后续字符的特殊含义 
        \| 或者( 匹配|符号前或后的正则表达式)
        \? 匹配其前面的字符0或1次 
        \+ 匹配其前面的字符至少1次 
        \{n\} 匹配前面的字符n次 
        \{m,n\} 匹配前面的字符至少m次,至多n次 
        \{,n\} 匹配前面的字符至多n次 
        \{n,\} 匹配前面的字符至少n次

** 位置锚定:** 定位出现的位置

        ^ 行首锚定,用于模式的最左侧 
        $ 行尾锚定,用于模式的最右侧 
        ^PATTERN$  用于模式匹配整行
            ^$  空行 
            ^[[:space:]]*$  空白行 
        \< 或 \b 词首锚定,用于单词模式的左侧 
        \> 或 \b 词尾锚定;用于单词模式的右侧 
        \<PATTERN\> 匹配整个单词

** 分组**

        分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+  
        分组括号中的模式匹配到的内容会被正则表达式引擎记录于 内部的变量中,这些变量的命名方式为: \1, \2, \3, ... 
        \1 表示从左侧起第一个左括号以及与之匹配右括号之间的 模式所匹配到的字符 
            示例: 
            \(string1\+\(string2\)*\) 
            \1 :string1\+\(string2\)* 
            \2 :string2 
        后向引用:引用前面的分组括号中的模式所匹配字符,而非 模式本身 
        或者:\| 
                示例:
                    a\|b: a或b  
                    C\|cat: C或cat   
                    \(C\|c\)at:Cat或cat

三、拓展正则表达式

        egrep = grep -E 
        egrep [OPTIONS] PATTERN [FILE...]
        扩展正则表达式的元字符: 
    ** 字符匹配: **
        . 任意单个字符 
        [] 指定范围的字符 
        [^] 不在指定范围的字符
    ** 次数匹配:**
         *:匹配前面字符任意次 
         ?: 0或1次 +:1次或多次 
         {m}:匹配m次 
         {m,n}:至少m,至多n次
    **位置锚定:**
        ^  :行首 
        $  :行尾
        \<, \b :语首 
        \>, \b :语尾 
    ** 分组:** 
        () 后向引用:\1, \2, ... 
    ** 或者:** 
        a|b: a或b C
        |cat: C或cat 
        (C|c)at:Cat或cat

实例

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
grep -i ^"s" /proc/meminfo
grep ^"[S/\s]" /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v "(bin/bash)$" /etc/passwd

3、显示用户rpc默认的shell程序
at /etc/passwd |grep "^(rpc)\b" |cut -d: -f 7

4、找出/etc/passwd中的两位或三位数
grep -o "\b[0-9]{2,3}\b" /etc/passwd

5、显示CentOS7的/etc/grub2.cfg文件中,的且后面存非空白字符的行
grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg

6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
netstat -tan |grep "LISTEN[[:space:]]+$"

7、显示CentOS7上所有系统用户的用户名和UID
cat /etc/passwd |cut -d: -f1,3 |grep "\b[0-9]{1,3}\b"

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行
cat /etc/passwd |grep "^(.)\b./\1$"
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
df |grep -o "[0-9]{1,3}%" | sort -rn

以上是关于linux正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

python 正则表达式 re模块基础

python成长之路第三篇_正则表达式