系统基础之sed工具详解


sed工具详解

NAME:

 sed – stream editor for filtering and transforming text(实现文本替换和过滤功能

类型: 行编辑器(流)

特点: 把文件中的每一行加载到内存中,匹配模式,把能够匹配到模式的内容输出到屏幕,不修改原文件

工作模式:

  每一次读取一行文本,复制到模式空间(sed工作区间 pattern space ),先输出到屏幕,判断文本能否被模式匹配到,被匹配到的行执行编辑操作,编辑的结果标准输出; 没有被模式匹配到的行,直接标准输出,可以被隐藏;

  保持空间:被匹配的行保存到保持空间 实现与模式空间进行操作

格式:

  sed [OPTION]… ’script‘ [input-file]…

      一次处理多行文本

  常用选项 OPTION:

     -n:不输出模式空间中的内容到屏幕 

     -e script,–expression=script:多点编辑; 一条命令中,可执行两条匹配规则,-e连接     例:sed -e ‘1~2p’ -e "3d" /etc/fstad

     -f PATH/TO/SED_SCRIPT_FILE  执行命令脚本 每行一个编辑命令

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

     -i[SUFFIX]:直接编辑原文件    建议使用: i.bak  sed 自动备份文件 

  地址定界命令

   (1)空地址:对全文进行处理

   (2)单地址:

      #指定行 

      /patten/:被此模式匹配到的每一行

    (3)地址范围

     #,#:起始行到结束行

     #,+#: 3,+8  从3.加8行,包含第3 行

     #,/pat1/: 从第几行到模式1匹配的行

     /pat1./pat2/ 模式1到模式2之间的行

     $:最后一行

   (4)步进:~        

     1~2:所有奇数行

     2~2:所有偶数

   (5)& 单词追加

     追加的内容前加&,以为着前面的内容保留

     追加的内容后加&,以为着后面的内容保留

 编辑命令

    d:删除   例:sed ‘1~2d’ /etc/passwd

    p:打印模式空间内容 指定行会显示两遍 命令加上-n使用

    a \text: 在被匹配到的行后面追加文本“text”,支持使用\n实现多行追加

    i \text: 在被匹配到的行前面插入文本“text”,支持使用\n实现多行插入

   c \text:把匹配到的行替换为此处指定的文本“text”;

    w /pATH/TO/SOMEFILE:保存模式空间内的行至指定的文件中

    r/PATH/FROM/SOMFILE:文件合并,读取指定文件的内容至当前文件被模式匹配到的行后面

    =:为模式匹配到的行打印行号

    !:条件取反

     模式后面,命令前面

    s///:查找替换,其分隔符可自行指定,,常用@@@,###

    s前面加执行范围,%表示全部  ,可写数字圈定范围

    替换标记

    g:全局替换

    w /PATH/TO/SOMMEFILE:将替换成功的行保存至指定文件中

     p:显示替换成功的行

    练习:

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

      [root@wen-7 ~]# sed 's@^[[:space:]]\+@@ ' /boot/grub2/grub.cf

        删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符

      [root@wen-7 ~]# sed 's@^#[[:space:]]*@@' /etc/fstab

        输出一个绝对路径给sed,去除其目录,其行为类似于dirname;

      [root@wen-7 tmp]# echo "/etc/passwd" | sed  's@^.*\<@@'
      passwd

 高级编辑命令

    h:把模式空间中的内容覆盖至保持空间中

    H:把模式空间中的内容追加至保持空间中

    g:把保持空间中的内容覆盖至模式空间中

    G:把保持空间中的内容追加至模式空间中

    x:把模式空间与保持空间中的内容互换

    n:覆盖读取匹配到的行的下一行至模式空间中;原行被覆盖

    N:追加读取匹配到的行的下一行至模式空间中,原文后追加

    d:删除模式空间中的行

    D:删除多行模式空间中的所有行;

实例:  

     sed -n ‘n;p’ FILE:显示偶数行 (第一行匹配,第二行把第一行覆盖输出,(第三行匹配,第四行把第三行覆盖输出)

     sed '1!G;h;$!d' FILE:逆序显示文件的内容 ()

     sed -n '1!G;h;$p' FILE :逆序显示文件

     sed ‘$!d’ FILE:取出文件的最后一行

     sed ‘$!N;$!D’ FILE:取出文件最后两行

     sed ‘/^$/d;G' FILE :删除原有的空白行,在所有非空白行后添加一个空白行

     sed ‘n;d’ FILE :显示奇数行

练习:

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

     [root@wen-7 base]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg 
     elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
     source $prefix/custom.cfg;
     fi
     ### END /etc/grub.d/41_custom ###

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

     [root@wen-7 base]# sed  's@^#[[:space:]]*@@g' /etc/fstab 
     /etc/fstab
     Created by anaconda on Tue Jul 19 18:59:02 2016
     Accessible filesystems, by reference, are maintained under '/dev/disk'

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

     A .[root@wen-7 base]# sed -n 's@^@#@gp' /root/.bash_logout 
       ## ~/.bash_logout
       #
     B. [root@wen-7 ~]# sed 's@^@&#@' /root/install.log

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

     [root@wen-7 base]# sed  -n 's@^[^#]@&#@gp' /etc/fstab     
     #dev/mapper/centos-root /                       xfs     defaults        0 0
     #UID=d9988fae-8ee0-434e-9caa-bd3bd20324a3 /boot                   xfs     defaults        0 0
     #dev/mapper/centos-swap swap                    swap    defaults        0 0

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

     目录名: 

     A root@wen-7 base]# echo "/etc/fstab" | sed 's@[^/]\+$@@g'
     B [root@wen-7 ~]# echo "/etc/issue"| sed 's@[^/]\+$@@' 
     C echo "/etc/issue"| sed -r 's@(.*/)([^/]+/)$@ /1@'
     D  [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'

    基名:

     A  [root@wen-7 ~]# echo "/etc/issue"|sed 's@^.*\<@@'
     B  [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\2@
     C  [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'

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

    centos6.8:  [root@wen-6 ~]# ifconfig|sed -n 2p |sed -r  's/.*addr:(.*)  Bca.*/\1/'            
                      172.18.19.210
    centos7.2:  [root@wen-7 tmp]# ifconfig|sed -n 2p |sed -r  's/.*inet(.*)  netmask.*/\1/'
                     172.18.19.219

    

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

  A [root@wen-7 ~]# ls /mnt/base/*.rpm  |  sed -r 's@.*\.([^.]+)\.rpm$@\1@'|sort| uniq -c
   1524 i686
   1416 noarch
   3578 x86_64
   
  B ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c

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

(0)
wencxwencx
上一篇 2016-08-10 10:15
下一篇 2016-08-10

相关推荐

  • Linux 第八天: 练习和作业

    Linux 第八天: (08月09日) 练习和作业       1删除/etc/grub2.cfg所有以空白开头的行行首空白字符 sed 's#^[[:space:]]\+##' /etc/grub2.cfgsed -r 's@^[[:space:]]+@@' /etc/grub2.cfg…

    Linux干货 2016-08-11
  • 源码编译安装http

    为什么需要编译安装软件?   1、软件在编译期间需要配置:比如需要指定安装路径,定制模块等功能;   2、软件需要统一安装路径:在编译安装时可以方便指定这些路径;   3、需要最新的版本:对于某些软件来说可能需要最新的版本。 编译前的准备工作:     1、安装开发工具:make、gcc等…

    Linux干货 2016-08-24
  • 使用cp命令定时复制数据

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

    Linux干货 2017-04-03
  • LINUX基础知识

    计算机的组成及其功能。 现代计算机体系将计算机分为控制器、运算器、存储器、输入设备和输出设备5个部分 *控制器:控制器是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,并根据具体要求进行控制、调度程序、数据、地址,协调计 算机各个部分工作,协调计算机各部分工作及内存、IO设备等的访问 *运算器:运算器是对数据进行各种算数运算和逻辑运算也就是对数据…

    Linux干货 2018-02-25
  • 如何新增加磁盘分区挂载

    新增磁盘和分区挂载我们先要了解fdisk的参数以及菜单的操作说明,下面是fdisk的参数说明:  fdisk参数说明: m :显示菜单和帮助信息 a :活动分区标记/引导分区 d :删除分区 l :显示分区类型 n :新建分区 p :显示分区信息 q :退出不保存 t :设置分区号 v :进行分区检查 w :保存修改 x :扩展应用,高级功能 1  查看磁盘…

    Linux干货 2018-03-26
  • mysql备份之mysqldump

    mysql备份之mysqldump 注意:备份文件和二进制日志文件不能与mysql放在同一磁盘下 节点1 1、节点1上修改mysql配置文件,开起二进制日志保存 这里我将二进制日志放在/data/mysql/目录下,/data/是我创建的另外一个lvm磁盘,本来想直接放在/data/下,发现无法启动mysql,所以建议还是放在/data/mysql中 [ro…

    Linux干货 2016-07-19