文本处理工具补充之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 09:38
下一篇 2016-08-11 09:38

相关推荐

  • 18页PPT带你深度解读运维自动化

    一、概述    在前面的文章中,提到【运维的本质—可视化】,在其中着重强调是自动化的可视化和数据化的可视化。在这个文章中,全面解码看看自动化的极致状态为什么是可视化?在前面的另外一篇文章【运维平台全体系介绍】中,也讲到运维平台体系的构成,提出“**及服务”的理念,其中有几部分和自动化密切相关,比如说资源及服务、配置及服务、架构…

    2015-04-03
  • Linux 系统启动流程及bash 脚本编程练习

    马哥教育网络班23期 第10周课堂练习 Linux 系统启动流程及bash 脚本编程练习1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区; (1)为硬盘新建两个主分区;并为其安装grub; (2)为硬盘的第一个主分区提供内核和ramdisk文件;为第二个分区提供r…

    Linux干货 2017-01-23
  • Linux网络属性管理

    Linux网络属性管理 linux的网络配置方法有多种,而且随发行版及版本而略微不同。我目前的测试环境为CentOS6和CentOS7。 常用的网络配置命令或方法有:ifconfig,route,netstat,ip,ss,nmcli,配置文件。 首先:命令方法介绍 一、命令简介 ifconfig:是个比较传统的命令,可以配置网络接口的启用及关闭,IP地址等…

    系统运维 2016-05-29
  • 使用cp命令定时复制数据

    cp命令 cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或者目录。 cp [选项] [参数] 常用选项: -r -R 递归拷贝目录及目录里所有的内容 -i 交互式,默认支持 -d 复制的时候,如果目录有链接文件,则只复制链接文件 -p –preserv,复制的时候将文件的属性一起复制 -a = -dpR -v 复制的时候显示详细过程 如何定期执…

    Linux干货 2017-04-03
  • Linux磁盘管理

    一、磁盘管理总体分类  1)磁盘结构  2)分区类型  3)管理分区 4)管理文件系统  5)挂载设备 6)管理虚拟内存 ……………………………………………………………………………………………………………………… 重要分类模块详解 ………………………………………………………………………………………………………………………

    Linux干货 2016-08-29
  • CentOS启动流程及Shell脚本编程练习

    一、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 第一步:POST加电自检 主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序。 第二步:Boot Sequence(选择启动设备以加…

    2017-11-26