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

相关推荐

  • shell脚本进阶

    一、流程控制 过程式编程语言:顺序执行、选择执行、循环执行 1.1 条件语句 1.1.1 if条件选择语句  选择执行: (注意: if 语句可嵌套) v  单分支:if  判断条件;then           条件为真的分支代…

    Linux干货 2016-11-27
  • Linux之任务计划 crontab

    Linux之任务计划    用过windows的同学应该都知道在控制面板中有一个“任务计划”选项,我们可以通过向导设置让计算机在某个时间点或者开机时运行某个脚本或者批处理等等,方便我们的日常管理监视工作;同样在Linux系统中,如果我们想在开机时就运行某个操作,可以直接将命令写入/etc/rc.local中,该操作就会在机器开机时运行;如…

    Linux干货 2015-05-18
  • 第五周作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;grep “^[[:space:]]+”  /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;[root@localhost ~…

    Linux干货 2017-03-10
  • N26第三周博客作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。    who | cut -d' ' -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。    last | head -1   3、取出当前系统上被用户当作其默认s…

    Linux干货 2017-02-03
  • 破坏grub实验之二

    删除/etc/fstab和/boot和grub的stage1阶段 [root@localhost ~]# rm -rf /boot [root@localhost ~]# rm -rf /etc/fstab  [root@localhost ~]# …

    Linux干货 2016-09-28
  • 0811linux基础小记(shell编程基础)

    1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。 #!/bin/bash echo "hostname: `hostname`" echo "OS VERSION: `cat /etc/issue`" e…

    Linux干货 2016-08-15