Linux学习笔记(三)-正则表达式

Linux正则表达式

grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。
egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。
fgrep :快速grep,这个版本匹配固定字符串而非正则表达式。并且是唯一可

grep:
    作用:文本过滤,文本搜索工具,根据用户指定的模式对目标文本进行匹配检查,打印匹配结果
    模式:由正则表达式字符及文本所填写的过滤条件,
    正则表达式有两类:
        基本正则表达式:BRE
        扩展正则表达式:ERE
            表达式:grep [OPTIONS] PATTERN [FILE...]
                选项:
                    --color=auto:对匹配到的文本着色显示
                    -v: 显示不能够被pattern匹配到的行
                    -i:忽略字符大小写
                    -o:仅显示匹配到的字符串
                    -s:不显示错误信息,通常与-q并用
                    -q:静默模式,不输出任何信息
                    -A #:after ,后#行
                    -B #:before,前#行
                    -C #:context,前后各#行

基本正则表达式介绍

正则表达式组成

    一般字符:没有特殊意义的字符
    元字符(meta字符):在正则表达式中有特殊意义

元字符匹配

            .:匹配任意单个字符;
            \:通常用于打开或关闭后续字符的特殊含义,如\(...\)与{...\}
            []:匹配指定范围内的任意单个字符;
            [^]:匹配指定范围外的任意单个字符;
            匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
            *:匹配前面的字符任意次;
                例如:grep "x*y"
                        abxy
                        xay
            .*:任意长度的任意字符;
            + : 匹配前面正则表达式的一个或多个扩展
            ? : 匹配前面正则表达式的零个或一个扩展
            | : 匹配|符号前或后的正则表达式
            ( ) : 匹配方括号括起来的正则表达式群
            \?:匹配其前面的字符0或1次,即前面的可有可无;
                例如:x\?y
                    xy,y,ay
            \+:匹配其前面的字符至少1次;
            \{m\}:匹配前面的字符m次;
                例如:x\{2\}y
                    xy,xxy,y,xxxxy,xyy
            \{m,n\}:匹配前面的字符至少m次,至多n次;
                例如:x\{2,5\}y
                    xy,y,xxy
                \{0,n\}:匹配前面的字符至多n次
                \{m,\}:匹配前面的字符至少m次

字符集[::]

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

位置锚定

    位置锚定:
        ^: 行首锚定;
            写在模式最左侧
        $: 行尾锚定:
            写在模式最右侧
            ^$: 空白行

            不包含特殊字符的连续字符组成的串叫单词:
            \<或\b: 词首,出现于单词左侧,
            \>或\b: 词尾,出现于单词右侧,
            \:匹配整个单词:

分组

    \(\):将一个或多个字符捆绑在一起,当做一个整体进行处理;
        例如:\(ab\)*
            分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用

引用

        例如\(ab\(x\)y\).*\(mn\)
            有编号:自左而后的左括号,以及与其匹配右括号
            \(a\(b\(c\)\)mn\(x\)\).*\1

            \#: 引用第n个括号所匹配到的内容,而非模式本身
                例如:
                    \(ab\?c\).*\1
                        abcmnaaa
                        abcmnabc
                        abcmnac
                        acxyac

练习(1)

1、显示/proc/meminfo文件中以大写或小写S开头的行;
    grep -i '^s' /proc/meninfo
    grep '^[Ss]' /proc/meninfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行;
    grep -v '/bin/bash$' /etc/passwd
3、显示/etc/passwd文件中ID号最大的用户名;
    sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
4、如果用户root存在,显示其默认的shell程序;
    id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
5、找出/etc/passwd中的两位或三位数;
    grep "\<[0-9]\{2,3\}\>" /etc/passwd
6、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存在空白字符的行;
    grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
7、找出”netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
    netstat -tan | grep "[LISTEN[[:space:]]*$"
8、添加用户bash、testbash、basher以及nologin(其shell为sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行,
    useradd bash
    useradd basher
    useradd testbash
    useradd -s /sbin/nologin nologin
    grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

练习(2)

    1、写一个脚本,实现如下功能
        如果user1用户存在,就显示其存在,否则加之;
        显示添加的用户的id号等信息;
        #!/bin/bash
        id user1 &> /dev/null && echo "user1 exists." || useradd user1
        id user1

    2、写一个脚本,完成如下功能
        如果root用户登陆了当前系统,就显示root用户在线;否则说明其未登陆
        w | grep "^root\>" &> /dev/null && echo "root logged" || echo "root not logged."

egrep及扩展的正则表达式

egrep = grep -E

    egrep [OPTIONS] PATTERN [FILE...]

     扩展正则表达式的元字符:
        字符匹配:
            .
            []
            [^]
        次数匹配:
            *
            ?:0或1次
            +:1次或多次
            {m}:匹配m次
            {m,n}:至少m,至多n次
        锚定:
            ^
            $
            \<,\b
            \>,\b
        分组:
            ()

            后向引用:\1,\2.....
        或者:
            a|b
                (C|c)at:C或cat

练习(3)

1、显示当前系统root、centos或user1用户的默认shell和UID
            grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7

2、找出/etc/rc.d/init.d/funtions文件(centos)中某单词后面跟一个小括号的行
            grep -E -o "^[_[:alpha:]]+(\)" /etc/rc.d/init.d/funtions

3、使用echo输出一绝对路径,使用egrep取出其基名
            echo "/mmt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
        进一步使用egrep取出路径的目录名,类似于dirname命令的结果

fgrep :不支持正则表达式搜索

|| 版权声明
作者:废权
链接:https://blog.yjscloud.com/archives/20
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
THE END
分享
二维码
Linux学习笔记(三)-正则表达式
Linux正则表达式 grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。 egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配……
<<上一篇
下一篇>>
文章目录
关闭
目 录