文本处理工具补充之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

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code