正则表达式及grep命令

作者: 阿铮OnMyWay | 来源:发表于2017-02-11 14:30 被阅读159次

    基本正则表达式元字符:

    字符匹配:

                    .:匹配任意单个字符
                        grep "r..t" /etc/passwd
                    []:匹配指定范围内任意单个字符
                    [^]:匹配指定范围外任意单个字符
                        [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
    
                        grep "r[[:alpha:]][[:alpha:]]t"
    

    匹配次数:写在要指定其出现次数的字符的后面

                    *:匹配其前面的字符任意次 0,1,多次
                        grep "x\+y"
                            abxy
                            aby
                            xxxxxy
                            yab
                    .*: 匹配任意长度的任意字符
                    \?:匹配其前字符0次或1次
                    \+:匹配其前的字符1次或多次,即字符出现至少1次
                    \{m\}:匹配其前字符m次
                    \{m,n\}:匹配其前字符至少m次,至多n次
                        \{0,n\}:至多n次
                        \{m,\}:至少m次
    

    位置锚定:

                    ^:行首锚定 写在模式最左侧
                    $:行尾锚定 写在模式最右侧
                    ^PATTERN$:用于PATTERN来匹配整行;
                        ^$:空白行;
                        ^[[:space:]]*$:空行或包含空白字符的行;
    
                    \< 或 \b:词首锚定,用于单词模式的左侧;
                    \> 或 \b:词尾锚定,用于单词模式的右侧;
                    \<PATTERN\>:匹配完整单词;
                    单词:非特殊字符组成的连续字符(字符串)都称为单词;
                分组及引用
                    \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理 反斜线表示转义
                        \(xy\)*ab
                    
    
                    Note:
                        分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
                        \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
                        \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
                        \3
                        ...
    

    grep命令: Global search REgular expression and Print out the line

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

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

        grep  [OPTIONS]  PATTERN  [FILE...]
        grep  [OPTIONS]  [-e PATTERN | -f FILE]  [FILE...]
    
            OPTIONS:
                --color=auto:对匹配到的文本着色后高亮显示;
                -i: ignorecase 忽略字符大小写
                -o: 仅显示匹配到的字符串本身
                -v: invert-match 反向匹配 显示未被匹配到的行
                -E:支持使用扩展的正则表达式元字符;
                -q: --quiet, --silent:静默模式,即不输出任何信息;
    
                -A #:after, 后#行
                -B #:before,前#行
                -C #:context,前后各#行
    

    egrep命令:

    支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E

    egrep [OPTIONS] PATTERN [FILE...]
            选项:
                -i, -o, -v, -q, -A, -B, -C
                -G:支持基本正则表达式 
    

    扩展正则表达式的元字符:

                字符匹配
                    .: 任意单个字符
                    []:指定范围内的任意单个字符
                    [^]:指定范围外的任意单个字符
    
                次数匹配
                    *:任意次 0,1,多次
                    ?:0次或1次 
                    +:其前字符至少1次
                    {m}:其前字符m次
                    {m,n}:其前字符至少m次至多n次
                        {0,n}
                        {m,}
                位置锚定
                    ^ 行首锚定 
                    $ 行尾锚定
                    \< \b 词首锚定
                    \> \b 词尾锚定
                分组及引用
                    (): 分组 括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中 
                    后向引用:\1, \2, ...
                或
                    a|b:a或者b;
                        C|cat:C或cat
                        (c|C)at:cat或Cat
    

    练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。

    cp /etc/skel /home/tuser1 
    chmod -R go=--- /home/tuser1
    

    2、编辑/etc/group文件,添加组hadoop。

    echo "hadoop:x:2017:" >> /etc/group
    

    3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop。

    echo "hadoop:x:1008:2017::/home/hadoop:/bin/bash" >> /etc/passwd
    

    4、复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。

    cp -r  /etc/skel /home/hadoop 
    chmod go=--- /home/hadoop
    

    5、修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。

    chown  -R  hadoop:hadoop  /home/hadoop 
    

    6、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;

    grep "^[sS]" /proc/meminfo
    grep -i "^s" /pro/meminfo 
    
    

    7、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

    grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1 
    

    8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;

    grep "/bin/bash" | cut -d: -f1 
    

    9、找出/etc/passwd文件中的一位数或两位数;

    grep -o  "\<[0-9]\{1,2\}\>" /etc/passwd
    

    10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

    grep "^[[:space:]]\+" /boot/grub2/grub.cfg 
    

    11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

    grep "^#[[:space:]]\+[^[:space:]]\+" /boot/grub2/grub.cfg
    

    12、打出netstat -tan命令执行结果中以‘LISTEN’,后跟空白字符结尾的行;

    netstat -tan | grep 'LISTEN[[:space:]]\+$' 
    

    13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

    grep -E "^([^:]+).*\1$" /etc/passwd 
    

    相关文章

      网友评论

        本文标题:正则表达式及grep命令

        本文链接:https://www.haomeiwen.com/subject/excoittx.html