关于文本处理工具之SED

                                                    处理文本的工具sed

行编辑器:
         sed
是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,我们称为“模式空间”
       
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕、接着处理以下一行,这样不断重复,直到文件末尾。
       
文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

 
        
还有一种模式叫做保持空间:sed工作机制是每次读取一行文本至‘模式空间’中,在模式空间中完成处理,将处理结果输出至标准输出设备,在模式空间中处理一行内容后会继续处理下一行,那么对于处理过的行可能还会做其它的处理,因此可以先把处理过的行‘导入’至保持空间中,如果需要后续处理的话,就在次‘导入’模式空间中处理,概念:模式空间就好比厨房,保持空间好比冰箱,厨房用作加工生产,冰箱负责,保存一些半成品材料。

        保持空间支持一些高级的命令来运用到保持空间当中 :具体看最下面:高级编辑命令选项

 

 

 

sed用法
sed [选项] 可以跟多个选项 'script'  [源文件]  可以跟多个文本
script: 地址定界编辑命令
,指明对文本做什么样的操作
  常用选项:
       sed -n    不输出模式空间中的内容自动打印   
            
例如 ~]# sed -n '2p' /etc/passwd    加了-n选项只显示出来定义的内容
p显示模式空间中的内容
                
       sed -e    scropt1 -e scropt2 -e
scropt2 可以进行多点编辑                           
       sed -f   
/path/to/script_file      从指定的文件中读取脚本并运行   
       sed -r   
支持使用扩展正则表达式
      
       sed -i    直接对源文件进行修改      
                
例如  选项i sed -i.bak '10d' f1 对源文件操作的时候 做好备份文件
                
 
地址定界:抽取的区域
  在不给地址的情况下,对全文进行处理
  给单地址: 
       #        
表示数字,指定的行
                 例如  ~]# sed -n '1p' f1     
只显示文本中的第1行
              
       $         最后一行
                 例如 
~]# sed -n '$p' f1      只显示文本中的最后的行
         
       /模式/   
被此处模式所能够匹配到的每一行;可以是正则表达式 
                 例如 ~]# sed -n '/root/p'
/etc/passwd  只匹配带有关键字的搜索内容
 
  地址范围:
      #1,#2    
从#1行到#2行                
                例如 ~]# sed -n '1,4p'
/etc/passwd     只显示文本中第1行到第4行的内容
               
      #,+n    
从#行开始,一直到向下的n行 
                例如 ~]# sed -n '4,8p' f1       
只显示文本中第4行开始到文本中第8行的内容
               
      #,/模式/ 
从#行开始,到第一次被模式所匹配到的行结束,中间的所有行内容    
                例如 ~]# sed -n '2,/root/p'
/etc/passwd
               
      /模式1/,/模式2/  从第一次呗模式1匹配到的行开始,

                                     到第一次被模式2匹配到的行结束,中间所有行内容 
  

      ~         步进,指定起始行,以及步长。 1~2 计数行 2-2 偶数行    
                 例如
~]# sed -n '1~2p' file1   至显示1的奇数行,1,3,5…..
                 例如 ~]# sed -n
'2~2p' file1   只显示2的偶数行,2,4,6…..     
     
  编辑命令:
     d :       
删除模式空间匹配的行          
                例如  ~]# sed '4d' f1   删除第4行的匹配的行,
不是删除源文件内容,输出删除而已
          
     p :        显示模式空间中的内容          

                例如  ~]# sed -n '4p' f1   
配合-n选项不输出文本内容为自动打印,p仅显示第4行匹配到的内容
          
     a \text : 
在行后面追加文本,支持使用\n换行字符实现多行追加   
                例如  ~]# sed '/^1/a\xiaomage'
file1   我在开头为数字1的行,追加内容到1之后的行后面
          
     i \text : 
在行前面插入文本,支持使用\n换行字符实现多行插入 
                例如 ~]# sed '/^1/i\xiaomage'
file1   同样,使用i 在开头数字为1的行,追加内容到1之前的行前面
          
     c \text : 
替换行为单行或多行文本
                例如  ~]# sed '/^1/c\xiaomage' file1  
将字符为1的行,替换成xiaomage内容
          
     w /path/to/somefile  
保存模式匹配的行至指定的文件
                例如   ~]# sed '/^1/w /root/f1 ' file1  
将字符开头为1的 保存指定的路径下,并命名
          
     r /path/from/somefile 
读取指定文件的文本至模式空间中匹配到的行后

     =          为模式空间中的行打印行号
     !         模式空间中匹配行取反处理
    
s/正则表达式/替换的位置/
               s///
查找替换,支持使用其他分隔符s@@@,s####
                替换标记
                    g  
行内全局替换
                    p   显示替换成功的行
                    w   w
/path/to/somefile   将替换成功的行保存至指定的文件
         
  高级编辑命令:
     h     
把模式空间中的内容覆盖至保持空间中
     H      把模式空间中的内容追加至保持空间中
     g     
从保持空间取出数据覆盖至模式空间
     G      从保持空间取出内容追加至模式空间
     x     
把模式空间中的内容与保持空间中的内容进行互换
     n      读取匹配到的行的下一行覆盖至模式空间
     N     
追加匹配到的行的下一行至模式空间
     d      删除模式空间中的行
     D      删除多行模式空间中的行首

            注:命令功能可使用!取反, ;分好可用于分隔脚本

练习 1
1 删除/etc/grub2.conf 文件中所有以空白开头的行行首的空白字符
  ~]# sed -r
's@^[[:space:]]+@@' /etc/grub2.cfg
(命令选项,-r使用扩展表达式,查找替换,分隔符,开头为空白的行
+匹配最少一次,后面跟路径)

2 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
~]# sed
's@^#[[:space:]]\+@@' /etc/fstab
 (命令选项, -r 使用扩展表达式,查找替换分隔符,^开头为#空白符的
匹配前面的字符至少一次)
 
3 在/root/install.log 每一行行首增加#号
~] # sed -r
's@(.*)@#\1@g'
/root/install.log
(命令选项,-r使用扩展表达式,s查找替换分隔符以分组.*任意字符\1#g替换分组内匹配到的字符)
~] #
sed 's@^@#@' /root/install.log
 (命令选项,s查找替换以^开头为#的字符,后面跟路径)
 
4
在/etc/fstab 文件中不以#开头的行的行首增加#号
~] # sed  's@^[^#]@#&@' /etc/fstab 

(命令选项,s查找替换开头^[^不以#]中增加#号, 后面跟路径)

 

5 处理/etc/fstab路径,使用sed 命令取出其目录名和基名
~] #echo /etc/sysconfig/ |sed -r 
's#[^/]+/?$##' 目录名
~] #echo "/etc/fst/sd" | sed   -r 's@(.*/)([^/]+/?)$@\1@'

 

6 利用sed 取出ifconfig 命令中本机的ipv4地址
~] #ifconfig|sed -n 2p |sed -e 
's/.*addr://' -e 's/ B.*//'

 

7 统计 centos 安装光盘中package 目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
~]# ls *.rpm |rev
|cut -d. -f2 |rev|sort |uniq -c

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

赞 (0)
小马哥小马哥
上一篇 2016-08-10 10:15
下一篇 2016-08-10 10:15

相关推荐

  • LAMP基于rsyslog+loganalyzer实现日志集中管理及分析

    前言 作为一名运维工程师,查看分析系统日志是每天必做的功课,但每次查看日志都得一台服务器一台服务器的看,几台服务器还可以这么对付,但如果管理成百上千台线上服务器,这种方法就捉襟见肘了。于是我们就需要用到日志服务器了,但是如何能让它更直观的显示呢?loganalyzer是一个不错的选择,本文将讲解如何使用rsyslog+loganalyze实现日志统一管理及分…

    Linux干货 2015-04-27
  • 设计模式(二)单件模式Singleton(创建型)

      几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销。再如大家最经常用的IM,如QQ,在同一台电脑,一个帐号只能有唯一的登录。 1. 问题 怎样确保一个特殊类的实例是独一无二的(它是这个类的唯一实例),并且这个实例…

    Linux干货 2015-06-24
  • 海量数据处理算法—Bloom Filter

    1. Bloom-Filter算法简介         Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。        Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表…

    Linux干货 2015-10-22
  • Linux磁盘和文件系统管理

    Linux磁盘和文件系统管理 linux磁盘管理 一、Linux设备类型     硬盘有机械硬盘(HDD)和固态硬盘(SSD)之分。机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等     几个部分组成。  &nbs…

    Linux干货 2016-04-11
  • N26_第一周作业

    一、描述计算机的组成及其功能。 计算机系统:是由硬件(Hardware)系统和软件(Software)系统两大部分构成。 1、硬件系统: 1)控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。2)运算器(Datapath):运算器的功能是…

    2017-02-20
  • 五大主流数据库模型

    导读:无论是关系型数据库还是非关系型数据库,都是某种数据模型的实现。本文将为大家简要介绍5种常见的数据模型,让我们来追本溯源,窥探现在流行的数据库解决方案背后的神秘世界。 什么是数据模型? 访问数据库中的数据取决于数据库实现的数据模型。数据模型会影响客户端通过API对数据的操作。不同的数据模型可能会提供或多或少的功能。一般而言,数据模型不会直接提供过多的功能…

    Linux干货 2015-04-04