码迷,mamicode.com
首页 > 其他好文 > 详细

grep及正则表达式

时间:2016-07-18 06:03:11      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:grep及正则表达式

grep及正则表达式

grep:
    Linux上文本处理三剑客
        grep:文本过滤(模式:pattern)工具;
            grep, egrep, fgrep
        sed:stream editor,文本编辑工具;
        awk:Linux上的实现gawk,文本报告生成器;

    grep: Global search REgular expression and Print out the line.
        作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
            模式:由正则表达式字符及文本字符所编写的过滤条件;
            REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;
                分两类:
                    基本正则表达式:BRE
                    扩展正则表达式:ERE
                        grep -E, egrep

                正则表达式引擎

                grep [OPTIONS] PATTERN [FILE...]

                        选项:
                            --color=auto: 对匹配到的文本着色显示;
                            -v: 显示不能够被pattern匹配到的行;
                            -i: 忽略字符大小写;
                            -o: 仅显示匹配到的字符串;
                            -q: 静默模式,不输出任何信息;
                            -A #:after, 后#行
                            -B #: before, 前#行
                            -C #:context, 前后各#行

                            -E:使用ERE;

[root@MyServer ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@MyServer ~]# grep  --color=auto root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@MyServer ~]# grep -v  root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:499:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

-i忽略大小写

-o只显示本身

[root@MyServer ~]# grep -o  root /etc/passwd
root
root
root
root
[root@MyServer ~]# grep -q  root /etc/passwd
[root@MyServer ~]# echo $?
0
[root@MyServer ~]# grep -q  xxxxxxxxxx /etc/passwd
[root@MyServer ~]# echo $?
1

一个匹配到,一个没有匹配到

-A 2 表示匹配到的行及其后2行都显示

[root@MyServer ~]# grep -A 2  root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

 -B 2表示匹配的行及前2行

[root@MyServer ~]# grep -B 2  root /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

-C 2表示匹配的行及其的前和后的各2行

[root@MyServer ~]# grep -C 2  root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin



        基本正则表达式元字符:
            字符匹配:
                .    :  匹配任意单个字符;
                []   : 匹配指定范围内的任意单个字符
                [^]  :匹配指定范围外的任意单个字符
                    [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
                    
表示查找s开头、n结尾,中间有2个单字符的项

[root@MyServer ~]# grep ‘s..n‘ /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:499:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

         
            匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
                *:匹配前面的字符任意次;可以为0,1,2,3....任意
                    例如: grep "x*y"
                        abxy
                        xay
                        xxxxxxy
                        

[root@MyServer ~]# cat aa.txt 
abxy
xay
xxxy
xxaay
aaaa
[root@MyServer ~]# grep x*y aa.txt 
abxy
xay
xxxy
xxaay

                    贪婪模式
                .*:任意长度的任意字符;

[root@MyServer ~]# cat aa.txt 
abxy
xay
xxxy
xxaay
aaaa

    

[root@MyServer ~]# grep x.*y aa.txt 
abxy
xay
xxxy
xxaay

                \?:匹配其前面的字符0或1次;即前面的可有可无;
                \+:匹配其前面的字符至少1次;
                \{m\}:匹配前面的字符m次;
                \{m,n\}:匹配前面的字符至少m次,至多n次;
                    \{0,n\}:匹配前面的字符至多n次;
                    \{m,\}:匹配前面的字符至少m次;

[root@MyServer ~]# grep   --color=auto  x*y aa.txt 
abxy
xay
xxxy
xxaay

            位置锚定:
                ^:行首锚定;用于模式的最左侧;
                $:行尾锚定;用于模式的最右侧;
                ^PATTERN$: 用于模式匹配整行;
                    ^$: 空行;
                    ^[[:space:]]*$

                \< 或 \b:词首锚定;用于单词模式的左侧;
                \> 或 \b:词尾锚定;用于单词模式的右侧;
                \<PATTERN\>:匹配整个单词;

            分组:
                \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
                    \(xy\)*ab

                Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
                    \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
                        \(ab\+\(xy\)*\):
                            \1: ab\+\(xy\)*
                            \2: xy

                后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)

    练习:
        1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
          grep -i ‘^s‘  /proc/meminfo

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

        3、显示/etc/passwd文件中ID号最大的用户的用户名;
            sort -t: -k3 -n /etc/passwd | tail -l | 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/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;
        # 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 -s /sbin/nologin nologin
        # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd


    练习:
        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 "no  loggin"

本文出自 “梁小明的博客” 博客,请务必保留此出处http://7038006.blog.51cto.com/7028006/1827208

grep及正则表达式

标签:grep及正则表达式

原文地址:http://7038006.blog.51cto.com/7028006/1827208

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!