美文网首页
六周一次课

六周一次课

作者: 艾特梁老师 | 来源:发表于2017-09-05 10:09 被阅读0次

    grep

    grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
    语法: grep [-cinvABC] 'word' filename
    -c :打印符合要求的行数
    -i :忽略大小写
    -n :在输出符合要求的行的同时连同行号一起输出
    -v :打印不符合要求的行;取反。
    -r :grep一般情况下用于文件,-r选项用来递归遍历目录。
    -A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
    -B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
    -C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

    [root@t1 tmp]# grep -A2 'zyb' /etc/passwd
    zyb:x:1001:1001::/home/zyb:/bin/bash
    user2:x:1003:1002::/home/user2:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    

    把包含'zyb'的行以及这行下面的两行打印出来。

    [root@t1 tmp]# grep -B2 'zyb' /etc/passwd
    chrony:x:997:995::/var/lib/chrony:/sbin/nologin
    bird:x:1000:1000::/home/bird:/bin/bash
    zyb:x:1001:1001::/home/zyb:/bin/bash
    

    把包含 ‘zyb’ 的行以及这行上面的两行都打印出。

    [root@t1 tmp]# grep -C2 'zyb' /etc/passwd
    chrony:x:997:995::/var/lib/chrony:/sbin/nologin
    bird:x:1000:1000::/home/bird:/bin/bash
    zyb:x:1001:1001::/home/zyb:/bin/bash
    user2:x:1003:1002::/home/user2:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    

    下面是常用的典型实例

    1. 过滤出带有某个关键词的行并输出行号
    [root@t1 ~]# grep -n 'root' /etc/passwd
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    
    1. 过滤不带有某个关键词的行并输出行号
    [root@t1 ~]# grep -v 'nologin' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    bird:x:1000:1000::/home/bird:/bin/bash
    zyb:x:1001:1001::/home/zyb:/bin/bash
    user2:x:1003:1002::/home/user2:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    
    1. 过滤出所有包含数字的行
    [root@t1 ~]# grep '[0-9]' /etc/inittab 
    # multi-user.target: analogous to runlevel 3
    # graphical.target: analogous to runlevel 5
    
    1. 过滤出所有不包含数字的行
    [root@t1 ~]# grep -v '[0-9]' /etc/inittab 
    # inittab is no longer used when using systemd.
    #
    # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    #
    # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
    #
    # systemd uses 'targets' instead of runlevels. By default, there are two main targets:
    #
    #
    # To view current default target, run:
    # systemctl get-default
    #
    # To set a default target, run:
    # systemctl set-default TARGET.target
    #
    
    1. 把所有以'#'开头的行去除
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    
    
    
    
    
    1. 去除所有空行和以'#'开头的行
    [root@t1 ~]# grep -v '^#' /etc/crontab |grep -v '^$' 
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    

    5实例中有空行,6的结果中就没有空行了

    • 在正则表达式中,“”表示行的开始,“$”表示行的结束,那么“$”就表示空行。
      “[集合]”表示集合中的某一个元素,此外还有一种用法[^集合]表示集合外任意字符。那么如果要过滤出不以数字以及大小写字母开的行怎么写?
    [root@t1 zyb]# cat 1.txt 
    123
    456
    #sdf
    asdf
    
    ASDdds
    123awe
    [root@t1 zyb]# grep -v '^[0-9a-zA-Z]' 1.txt 
    #sdf
    
    [root@t1 zyb]# grep '[^0-9a-zA-Z]' 1.txt 
    #sdf
    

    用了两种方法,但是第一种打印的有空行,第二种没有空行,两者不太一样。空行的开头没有字符。

    1. 过滤任意一个字符;过滤重复的字符
    [root@t1 tmp]# !g
    grep -n 'r.o' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    28:fex:x:r.o:asldkrf
    29:ftp:x:rao:89sdf
    30:r3o:x:wer
    31:rAo:x:dsfa
    [root@t1 tmp]# grep -n 'ro*o' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    14:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
    18:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    21:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
    26:distro:x:1004:1004::/home/distro:/bin/bash
    
    
    • "."匹配除换行符\n之外的任意单个字符,awk则中可以ab.匹配abc或bad,不可匹配abcd或abde,只能匹配单字符。
    • ""匹配之前的项0次或者多次,co*l匹配cl、col、cool、coool等。代表0次时,就是没有o。
    1. { },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即 ‘oo’ 的行。注意,{ }左右都需要加上脱意字符 ‘\’, 另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘{n1,n2}’ 其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。
    [root@t1 tmp]# grep 'o\{2\}' passwd 
    root:x:0:0:root:/root:/bin/bash
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    hoom
    hooom
    roooot
    
    1. 筛选一个或一个以上前面的字符;
      '+'匹配之前的项1次或者多次
    [root@t1 tmp]# grep -E 'o+o' passwd 
    root:x:0:0:root:/root:/bin/bash
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    hoom
    hooom
    roooot
    
    1. 筛选零个或一个前面的字符
      '?'匹配之前的项1次或者0次

    2. 筛选字符串1或者字符串2
      |交替匹配|两边的任意一项ab(c|d)匹配abc或abd

    相关文章

      网友评论

          本文标题:六周一次课

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