文本处理工具补充之sed命令

sed:stream editor,行编辑器

        sed命令工作原理:它在处理数据时,每次只处理一行,首先把当前处理的行存储在临时缓冲区中,我们称这个缓冲区称为“”模式空间“,接着用sed命令处理缓冲区中的内容,处理完后,把缓冲区中的内容送到屏幕上显示出来,接着去处理下一行,重复执行,直到至末行,这里需要注意的是我们没有编辑原文件,原文件不会改变,当然我们也可以通过相关命令来编辑原文件。

        sed的主要功能:查找匹配到的文本打印出来,替换匹配到的文本,编辑文本等

       前面我们提到的grep也是针对行的操作的,也可以查找匹配到需要的内容,那么他们有什么区呢?grep:文本搜索工具,根据用户指定的模式来对文本逐行匹配检查,打印到匹配到的行,只能搜索不能编辑,-v和-o的功能与sed中的替换功能类似。

        在使用sed处理行时需要注意:如果说要去掉行中的某一部分内容或者是某删除某部分内容,我们只能使用替换方法处理,因为sed时针对行编辑的,d选项操作会删除整行。

       

    sed选项:

            -n:不输出模式空间中的内容;默认情况下默认打印所有文本,也会打印我们匹配到的内容

            root@cenots6.8  ~ # sed '1p' /etc/issue 
            CentOS release 6.8 (Final)
            CentOS release 6.8 (Final)
            Kernel \r on an \
            root@cenots6.8  ~ # sed -n '1p' /etc/issue 
            CentOS release 6.8 (Final)

             -r:支持扩展正则表达式

             -e:支持多点编辑

            root@cenots6.8  ~ # sed -n -e '1p' -e '1p' /etc/issue 
            CentOS release 6.8 (Final)
            CentOS release 6.8 (Final)

              a\:在匹配到的行的下一行添加内容

            root@cenots6.8  ~ # sed '1a\I am here' /etc/issue
            CentOS release 6.8 (Final)
            I am here
            Kernel \r on an \m

                i\:在匹配到的行的上一行添加内容

            root@cenots6.8  ~ # sed '1i\I am here' /etc/issue
            I am here
            CentOS release 6.8 (Final)
            Kernel \r on an \

                c\:把匹配到的行替换为你需要的内容

            root@cenots6.8  ~ # sed '1c\I am here' /etc/issue
            I am here
            Kernel \r on an \m

                 w:把匹配到的内容覆盖到指定的文件中。。。。注意 覆盖 覆盖 覆盖。。。。。

            root@cenots6.8  ~ # sed '1w /testdir/FA' /etc/issue
            CentOS release 6.8 (Final)
            Kernel \r on an \m
            root@cenots6.8  ~ # cat /testdir/FA
            CentOS release 6.8 (Final)

                 r:把文件中的内容输入到匹配到的行的下一行

            root@cenots6.8  ~ # sed '1r /testdir/FA' /etc/issue
            CentOS release 6.8 (Final)
            aaaaaaaaaaaaaaaaaaaaaa
             Kernel \r on an \

                =:在匹配到的行显示行号

            root@cenots6.8  ~ # sed '2=' /etc/issue
            CentOS release 6.8 (Final)
            2
            Kernel \r on an \

                 !:模式空间中匹配行取反处理

                        root@cenots6.8  ~ # cat /etc/issue
                        CentOS release 6.8 (Final)
                        Kernel \r on an \m
                        root@cenots6.8  ~ # sed '1!d' /etc/issue
                        CentOS release 6.8 (Final)
                        root@cenots6.8  ~ # sed '1d' /etc/issue
                        Kernel \r on an \m

                &:匹配到的字符

            root@Centos7.2  ~ # sed -n 's@root@&superman@p' /etc/passwd   ----&superman 在匹配到的单词后加superman
            rootsuperman:x:0:0:root:/root:/bin/bash
            operator:x:11:0:operator:/rootsuperman:/sbin/nologin
            root@Centos7.2  ~ # sed -n 's@root@superman&@p' /etc/passwd   ----&superman 在匹配到的单词前加superman
            supermanroot:x:0:0:root:/root:/bin/bash
            operator:x:11:0:operator:/supermanroot:/sbin/nologin

                 s///:查找替换,支持使用正则表达,也可以将///替换为@@@

                                g: 行内全局替换
                                p: 显示替换成功的行
                                w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中   

sed高级用法:
                h: 把模式空间中的内容覆盖至保持空间中
                H:把模式空间中的内容追加至保持空间中
                g: 从保持空间取出数据覆盖至模式空间
                G:从保持空间取出内容追加至模式空间
                x: 把模式空间中的内容与保持空间中的内容进行互换
                n: 读取匹配到的行的下一行覆盖至模式空间
                N:追加匹配到的行的下一行至模式空间
                d: 删除模式空间中的行
                D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

       应用示例

                sed -n 'n;p' FILE          #显示偶数行
                sed '1!G;h;$!d' FILE       #倒序显示
                sed '$!N;$!D' FILE         #显示最后两行
                sed '$!d' FILE             #只显示最后一行
                sed ‘G’ FILE             #每一行的后面加一个空行
                sed ‘g’ FILE             #将每行用空行替换
                sed ‘/^$/d;G’ FILE       #删除所有空行后,在行后追加空行
                sed 'n;d' FILE             #显示基数行
                sed -n '1!G;h;$p' FILE     #倒序排序

   

练习:

        1、替换/etc/inittab文件中“id:3:initdefault:”一行中的数字为5

        sed 's@\(id:\)[0-9]\(:initdefault:\)@\110000\2@' /etc/inittab

        2、删除/etc/init.d/functions 文件中的空白行

        sed "/^$/d" /etc/init.d/functions

        3、删除/etc/inittab 文件中的空白行

        sed "s@^#@@g" /etc/inittab

        4、删除/etc/rc .d/rc.sysinit文件中以#后面跟至少一个空白符开头的行的行首的#和空白字符

        sed "s@^#[[:space:]]\+@@g" /etc/rc.d/rc.sysinit

        5、删除/boot/grub/grub.conf文件中行首空白字符

        sed "s@^[[:space:]]\+@@g" /boot/grub/grub.conf

        6、取出一个文件路径的目录名称,如/etc/sysconfig/network,

        echo "/etc/sysconfig/network" |sed "s@/.*/@@g"        --basename
        echo "/etc/sysconfig/network" | sed 's@[^/]\+/\?$@@g'  --dirname                        
        echo "/etc/fst/sd" | sed   -r 's@(.*/)([^/]+/?)$@\2@'

        7、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符

                sed -e "s@^[[:space:]]\+@@g" -e "/^$/d" /etc/grub2.cfg

        8、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

                sed 's@^#[[:space:]]\+@@g' /etc/fstab

        9、在/root/install.log每一行行首增加#号

                sed -r 's@(^.*$)@#\1@g' /root/install.log
                sed "s@\(.*\)@#\1@g" /root/install.log

        10、在/etc/fstab文件中不以#开头的行的行首增加#号

              sed -r 's@(^[^#].*)@#\1@g' /etc/fstab
              sed "s@\(^[^#].*\)@#\1@g" /etc/fstab

        11、处理/etc/fstab路径,使用sed命令取出其目录名和基名

               echo "/etc/fstab/" | sed   -r 's@(.*/)([^/]+/?)$@\2@'
               echo "/etc/fstab/" | sed 's@[^/]\{1,\}/\?$@@

        12、利用sed 取出ifconfig命令中本机的IPv4地址

                ifconfig|sed -n 2p |sed -r  's/.*addr:(.*)  Bca.*/\1/'
                ifconfig|sed -n 2p |sed -e  's/.*addr://' -e 's/ B.*//'

        13、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

                cd /run/media/naruto/CentOS\ 7\ x86_64/Packages/
                ls *.rpm |sed -r 's#.*\.(.*)\.rpm$#\1#'|sort  |uniq -c
                ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c

        14、正则表达式表示身份证号

egrep "\<((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|(71|81|82))([0-9]){4}(19|20)([0-9]){2}((0[1-9])|(1[0-2]))(0[1-9]|([0-9])|(2[0-9])|(3[0-1]))([0-9]){3}([0-9]|X)\>" filename

        15、正则表达式表示手机号
grep -E -o "(\+86)?1[38][0-9]{9}|14[57][0-9]{8}|15[0-35-9][0-9]{8}|17[0678][0-9]{8}" haoma

        16、正则表达式表示邮箱

          egrep "\<([[:alnum:]]+(-|_)*[[:alnum:]]*)\>@([[:alnum:]]+\.)+[[:alnum:]]+" mail 
          grep -E -o '[a-zA-Z0-9]+[[:alnum:]\.\_-]*@[a-zA-Z0-9]+[[:alnum:]\.\_-]*' haoma

        17、正则表达式表示QQ号

          grep -E -o '\b[1-9][0-9]{4,12}\b' haoma

   

原创文章,作者:Naruto,如若转载,请注明出处:http://www.178linux.com/32235

(0)
NarutoNaruto
上一篇 2016-08-11
下一篇 2016-08-11

相关推荐

  • 初学Linux之用户、组和权限

    1、用户和组管理命令 
    2、理解文件权限和默认权限 
    3、设置文件权限
    4、特殊权限 
    5、ACL

    2017-12-08
  • 浅谈HTTP协议以及httpd的十八般武艺

      初识HTTP协议                HTTP(hyper text transfer protocal)作为互联网应用最广泛的协议,任何一个运维人员都无法回避它,HTTP的目的就是提供一种发布和…

    Linux干货 2016-02-14
  • 马哥教育网络班22期+第11周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 Bob先利用单向加密算法提取当前数据的指纹(特征码),再用自己的私钥加密数据指纹并附加于数据尾部, 然后利用对称加密将整个文件加密,之后用Alice的公钥加密对称加密密钥附加于尾部。 Alice收到数据后,先用自己的私钥解密,得到对称加密密钥,之后用对称加密密钥解密,然后用Bob的公钥 解密得到数据指纹,并且验…

    Linux干货 2016-11-14
  • NTP服务器搭建

        1、NTP(Network Time Protocol)         在计算机世界中,NTP(Network Time Protocol,网络时间协议)被广泛用于对时间的统一性和准确性要求非常高的场景,是用来使网络中的各个计算机时间同步的一种协议。…

    Linux干货 2015-11-18
  • 自制Linux

    1. 分区出来两个区 fdisk /dev/sdb     2. 创建文件系统   [root@localhost ~]# mkfs.ext4 /dev/sdb1  [root@localhost ~]# mkfs.ext4 /dev/sdb2 3.…

    Linux干货 2016-09-16
  • linux进程管理及计划任务

    进程管理: 什么是进程?   在Linux系统当中:触法任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。 进程与程序: 程序(program):通常为二进制程序放置在存储媒介中,以物理文件的形式存在。 进程(process):程序被触发后…

    Linux干货 2016-09-13