美文网首页
第四章:三剑客之grep、sed

第四章:三剑客之grep、sed

作者: chenkang | 来源:发表于2019-11-13 20:27 被阅读0次

    第一节:正则表达式

    正则符号 含义
    ^ 开头
    $ 结尾
    . 任意一个字符
    ^$ 空行
    * 匹配前面的字符出现0次或者0次以上
    .* 所有
    \ 取消特殊字符的含义
    {n} 前面的字符匹配n次
    {n,} 前面的字符至少匹配n次
    {n,m} 前面的字符至少匹配n次,最多匹配m次,n<m
    {,m} 前面的字符最多匹配m次

    第二节:grep | egrep 过滤

    1.grep相关option

    option:
            -i      忽略大小写
            -v      排除 
            -n      显示过滤出来的内容所在文件的行号
            -c      统计过滤出来的总行数
            -w      精确匹配
            -o      只显示过滤出来的内容
            -E      支持扩展正则
            -r      递归过滤
            -R      递归过滤 
            -A      显示出过滤的出来的内容向下多少行
            -B      显示出过滤的出来的内容向上多少行
            -C      显示出过滤的出来的内容向上或向下多少行
            -q      安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0
    

    2.相关参数的用法

    1.不区分大小写过滤root  -i
    [root@lb03 ~]# grep  -i  'root'  passwd 
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    ROOT
    
    2.过滤出含有root字符串的行数  -C
    [root@lb03 ~]# grep  -ic  'root'  passwd 
    4
    
    3.过滤出含有root字符串的行,同时显示行号  -n
    [root@lb03 ~]# grep  -in  'root'  passwd 
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    22:ROOT
    
    4.过滤出除 /sbin/nologin 字符串的其他行(取反) -v
    [root@lb03 ~]# grep -v  '/sbin/nologin'  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
    ROOT
    
    5.精确过滤 -w
    [root@lb03 ~]# grep  -iw  'root'  passwd 
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    ROOT
    
    6.只显示所过滤的字符串root -o
    [root@lb03 ~]# grep  -o  'root'  passwd 
    root
    root
    
    7.递归过滤  -r
    [root@lb03 ~]# grep -r  'root'  ./*
    ./anaconda-ks.cfg:rootpw --iscrypted $6$uxSmIs.46F1YbJYk$W0p9dIjeZPPe556u5YJGhQvOQyEdTk2Q9pHELzfEvDFfUXbKSiyUB9RDAPsfpzSj9BoBXMoyYP87m2qv5xW56/
    ./anaconda-ks.cfg:pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
    ./data/oldboy.txt:root
    
    8.过滤出adm字符串的后两行 -A
    [root@lb03 ~]# grep -n -A 2 'adm'  passwd 
    4:adm:x:3:4:adm:/var/adm:/sbin/nologin
    5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6-sync:x:5:0:sync:/sbin:/bin/sync
    
    9.过滤出adm字符串的前两行 -B
    [root@lb03 ~]# grep -n -B 2 'adm'  passwd 
    2-bin:x:1:1:bin:/bin:/sbin/nologin
    3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4:adm:x:3:4:adm:/var/adm:/sbin/nologin
    
    10.过滤出adm字符串的前两行后两行 -C
    [root@lb03 ~]# grep -n -C 2 'adm'  passwd 
    2-bin:x:1:1:bin:/bin:/sbin/nologin
    3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4:adm:x:3:4:adm:/var/adm:/sbin/nologin
    5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6-sync:x:5:0:sync:/sbin:/bin/sync       
    

    3.grep结合正则表达式的用法

    1.统计passwd文件中所有字母出现的次数
    [root@lb03 ~]# grep -o  '[a-Z]'  passwd  |sort |uniq -c |sort -rn
         80 n
         77 o
         62 s
         55 i
         42 t
         38 b
     
    2.统计passwd文件中所有单词出现的次数
    [root@lb03 ~]# grep -Eo  '[a-Z]+'  passwd  |sort |uniq -c |sort -rn
         23 sbin
         21 x
         17 nologin
          6 var
          5 bin
          4 root
          3 sync
          3 spool
          3 shutdown
    
    3.取ip地址
    [root@lb03 ~]# ip a s eth0 |grep -w inet  | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' |head -1
    10.0.0.4
    
    4.取出文件中的身份证号码
    [root@lb03 ~]# grep -Ew '[0-9]{17}[0-9X]'  id.txt
    邹 371481199403259478
    莫 52020319810613433X
    荣 530124197504135438
    阮 360702197902169951
    

    第三节:sed流编辑器

    1.sed的工作模式

    2.sed的相关选项即参数

    选项: 
            -n          取消默认输出
            -i          修改文件内容
            -r          支持扩展正则 
            -e          允许多项编辑
                    
    内部命令  
            a       追加
            i       插入
            s       替换
            g       全局
            p       打印
            d       删除
            i       忽略大小写
            c       原位置替换
            h               
            H 
            g 
            G 
    

    3.sed用法

    1.显示单行      
    [root@lb03 ~]# sed -n  '1p'  passwd 
    
    2.显示连续的多行
    [root@lb03 ~]# sed -n  '1,3p'  passwd 
    
    3.显示不连续的多行
    [root@lb03 ~]# sed -n  '1p;3p'  passwd 
    [root@lb03 ~]# sed -n '$p'  passwd
        
    4.过滤字符串 
    [root@lb03 ~]# sed  -n  '/root/p'  passwd 
    
    5.过滤以root开头
    [root@lb03 ~]# sed  -n  '/^root/p'  passwd 
    [root@lb03 ~]# sed  -n  '/^ROOT/p'  passwd 
    
    6.过滤以t为结尾的行
    [root@lb03 ~]# sed  -n  '/t$/p'  passwd 
            
    7.过滤出字符连续的行     
    [root@lb03 ~]# sed  -n  '/adm/,/ftp/p'  passwd 
    
    8.取出不同的字符串
    [root@lb03 ~]# sed  -n  '/adm/p;/ftp/p'  passwd 
    [root@lb03 ~]# sed -rn  '/adm|ftp/p'  passwd 
    
    9.删除1行
    [root@lb03 ~]# sed '1d'  passwd 
    
    10.删除连续的多行
    [root@lb03 ~]# sed '1,20d'  passwd 
    
    11.删除整个文件
    [root@lb03 ~]# sed '1,$d'  passwd 
    
    12.删除不连续的多行
    [root@lb03 ~]# sed '1d;3d'  passwd 
    
    13.在某一行的后面追加内容 
    [root@lb03 ~]# sed  '1aoldboy'  test.txt
    
    14.在某一行的前面追加内容
    [root@lb03 ~]# sed '1ioldboy'  test.txt
    
    15.在文件的开头添加内容
    [root@lb03 ~]# sed  '1s/^/oldboy\n/'  test.txt
    
    16.在文件的结尾加入内容
    [root@lb03 ~]# sed  '$s/$/\noldgirl/'  test.txt
    

    4.sed的替换用法

    1.全局替换
    [root@lb03 ~]# sed  's#root#admin#g'  test.txt 
    
    2.替换多行
    [root@lb03 ~]# sed  '1,5s#bin#shell#g'  test.txt
    
    3.只替换每一行第一个匹配的
    [root@lb03 ~]# sed  '1,5s#bin#shell#'  test.txt
    
    4.根据字符串匹配进行替换
    [root@lb03 ~]# sed   '/^root/s#root#admin#g'  test.txt
    
    5.忽略大小写替换
    [root@lb03 ~]# sed   's#root#admin#gi'  test.txt
    
    -c  原位置替换 (按行进行替换) 
    6.匹配第一行进行替换
    [root@lb03 ~]# sed  '1cadmin'  test.txt
    
    7.包含匹配字符串的行全部替换
    [root@lb03 ~]# sed  '/root/cadmin'  test.txt
    
    [root@lb03 ~]# sed '7cSELINUX=enforcing'  /etc/sysconfig/selinux
    
    [root@lb03 ~]# sed '/^SELINUX=/cSELINUX=enforcing'  /etc/sysconfig/selinux
    
    [root@lb03 ~]# sed  '/^#Port/cPort 666'  /etc/ssh/sshd_config
    
    [root@lb03 ~]# sed  '17cPort 666'  /etc/ssh/sshd_config
    
    [root@web ~]# sed  '/^user/cuser www;'  /etc/nginx/nginx.conf
    
    8.将文本中的换行符替换成空格
    [root@lb01 ~/scripts/02]# cat url.txt 
    www.baidu.com
    www.taobao.com
    www.mysun.com
    [root@lb01 ~/scripts/02]# sed ':label;N;s/\n/ /;b label' url.txt
    www.baidu.com www.taobao.com www.mysun.com
    
    w   #将内容写到新的文件中
    [root@lb03 ~]# sed  -n  '/root/w file.txt'  passwd 
    [root@lb03 ~]# sed  -n  '1w file1.txt'  passwd 
    
    e  #允许多项编辑 
    [root@lb03 ~]# sed  '1,10d' passwd  |sed  's#root#123#g'
    [root@lb03 ~]# sed  -e  '1,10d'  -e 's#root#123#g'  passwd 
    
    n    #读入下一输入行,从下一条命令进行处理(对下一行进行n之后的处理)
    [root@lb03 ~]# sed   '/root/{n;d}'  passwd 
    
    
    [root@lb03 ~]# sed   '/root/{n; s/bin/123/}'  passwd
    
    !    #非
    [root@lb03 ~]# sed -n  '1!p'  passwd
    [root@lb03 ~]# sed   '1!d'  passwd
    
    #显示行号  
    [root@lb03 ~]# sed  =  passwd
    
    #对文件进行编辑的同时备份原文件(文件名以.bak结尾)
    [root@lb03 ~]# sed -i.bak '1,$d' passwd
    

    5.sed的高级用法

    内部命令:
            h         #把模式空间里的内容重定向到暂存缓冲区
            H         #把模式空间里的内容追加到暂存缓冲区
            g         #取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
            G         #取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面
            
    用法:
    1.将第一行的写入到暂存区, 替换最后一行的内容
    [root@lb03 ~]# sed  '1h;$g'  file.txt
    
    2.将第一行的写入到暂存区, 在最后一行调用暂存区的内容
    [root@lb03 ~]# sed  '1h;$G'  file.txt
    
    3.将第一行的内容删除但保留至暂存区, 在最后一行调用暂存区内容追加至于尾部
    [root@lb03 ~]# sed  '1{H;d};$G'  file.txt
    
    4.将第一行的内容写入至暂存区, 从第二行开始进行重定向替换
    [root@lb03 ~]# sed  '1h;2,$g'  file.txt
    
    5.将第一行重定向至暂存区, 2-3行追加至暂存区, 最后追加调用暂存区的内容
    [root@lb03 ~]# sed '1h;2,3H;$G'  file.txt
    

    6.sed给文件添加注释

    1.为格式规范的文本添加注释
    [root@lb03 ~]# sed  's#^#\##g'  file.txt
    
    2.为格式杂乱的文本添加注释
    原文本:
    [root@lb03 ~]# cat file.txt
        root:x:0:0:root:/root:/bin/bash
    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
    
    进行添加注释:
    [root@lb03 ~]# sed  's/^[ \t#]*/#/g'  file.txt
    #root:x:0:0:root:/root:/bin/bash
    #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
    
    3.把passwd文件中的第一列与第七列进行位置调换(后向引用)
    [root@lb03 ~]# sed  -r  's#(.*)(:x.*:)(.*)#\3\2\1#g'  passwd
    /bin/bash:x:0:0:root:/root:root
    /sbin/nologin:x:1:1:bin:/bin:bin
    /sbin/nologin:x:2:2:daemon:/sbin:daemon
    

    相关文章

      网友评论

          本文标题:第四章:三剑客之grep、sed

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