文件处理工具系列(二):行编辑器sed

1、sed介绍

    sed(Stream EDitor),是一种行编辑工具,它一次处理一行内容。处理时,把当前匹配到的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令对这些数据做出相应的增删改查操作,处理完成后,默认输出至屏幕,而未被匹配到的行也将默认输出至屏幕。而原来的文件内容并没有发生改变,除非使用重定向存储输出。  

wKiom1ep1dbTNvPcAAAMsKrIBe4763.png

2、sed用法

   <1>语法格式

      sed [option]… 'addressCOMMAND' inputfile…

   <2>[option]

-n     不输出模式空间和未匹配到的数据
-e     多点编辑
-r     支持使用扩展的正则表达式
-i     原处编辑

   注:虽然可通过sed -i.bak '4,$d' /tmp/fstab类似的方式处理/tmp/fstab文件,而且会在/tmp目录下生成fstab.bak备份的文件,但依然不建议在生产生活中使用

[root@centos7 ~]# sed -i.bak '4,$d' /tmp/fstab 
[root@centos7 ~]# ls /tmp/
fstab  fstab.bak  functions

   <3>address

不给地址     对全文进行搜索
单地址
        #     指定的行
        /pattern/     被模式匹配到的每一行
地址范围
        #,#     指定的行到指定的行
        #,+#     指定的行到下几行
        /pat1/,/pat2/     第一次被某模式匹配到的行到最后一次被某模式匹配到的行
        #,/pat1/     第几行到最后一次被某模式匹配到的行
步进
        1~2     奇数行
        2~2     偶数行

   <4>COMMAND

          d:删除模式空间匹配到的行

          p:显示模式空间中的行

             注:此命令一般与-n选项同用,否则匹配到的内容会显示俩次

          a \text\:在行后面追加文本,支持使用\n实现多行追加

          i \text\:在行前面插入文本,支持使用\n实现多行插入

          c \text\:替换为单行或多行文本

          w /path/to/somefile:保存模式匹配到的行至指定文件,一般也会与-n同用

[root@centos7 ~]# sed -n '/UUID/w /tmp/fstab.tmp' /etc/fstab
[root@centos7 ~]# cat /tmp/fstab.tmp 
UUID=cb86b5f6-3ea1-48b6-ad1d-5a77cf565d5b /boot                   xfs     defaults        0 0

          r /path/from/somefile

[root@centos7 ~]# cat a
haha
[root@centos7 ~]# sed '/Kernel/r a' /etc/issue
\S
Kernel \r on an \m
haha

          s///:查找替换,支持使用其它分隔符,s@@@,s###

                g:全局替换 

针对以上知识点,做以下加强练习

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

[root@centos7 ~]# sed -r 's@^[[:space:]]\+@@' /etc/grub2.cfg

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

[root@centos7 ~]# sed -r 's@^#[[:space:]]+@@' /etc/fstab

3、在/etc/fstab每一行行首增加#号

[root@centos7 ~]# sed 's@^@#&@' /etc/fstab

或者

[root@centos7 ~]# sed 's@^.*@#&@' /etc/fstab

注意:此处不可写成sed 's@^(.*)@#$@' /etc/fstab,这是错误的,此处锚定的是(),而不是行首

[root@centos7 ~]# cat > f1
()
a
b
^C
[root@centos7 ~]# sed 's@^(.*)@#&@' f1
#()   
a
b

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

[root@centos7 ~]# sed 's@^[^#]@#&@' /etc/fstab

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

[root@centos7 ~]# echo /etc/fstab | sed -r 's@(.*/)([^/]+/?$)@\1@'
/etc/
[root@centos7 ~]# echo /etc/fstab | sed -r 's@(.*/)([^/]+/?$)@\2@'
fstab

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

[root@centos7 ~]# ifconfig | sed -n '2p' | sed -e 's@.*inet[[:space:]]@@' -e 's@[[:space:]].*@@'

或者

[root@centos7 ~]# ifconfig | sed -n '2p' | sed -r 's@.*inet[[:space:]](.*)[[:space:]]net.*@\1@'
10.1.0.17

当然,如果使用cut就简单多了

[root@centos7 ~]# ifconfig | sed -n '2p' | tr -s ' ' | cut -d' ' -f3
10.1.0.17

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

[root@centos7 Packages]# ls | grep "rpm$" | sed -e 's@.rpm$@@' -e 's@.*\.@@' | sort | uniq -c
   2000 i686
   2938 noarch
   4069 x86_64

或者

[root@centos7 Packages]# ls | grep "rpm$" | sed -r 's@.*\.(.*)\.rpm@\1@' | sort | uniq -c
   2000 i686
   2938 noarch
   4069 x86_64

注意常见的错误

使用正则表达式注意.的转义

使用扩展正则表达式注意分组时要加-r

再或者

[root@centos7 Packages]# ls | grep "rpm$" | rev | cut -d. -f2 | sort | uniq -c
   4069 46_68x
   2000 686i
   2938 hcraon

总结:个人认为,sed命令是grep命令的延伸,虽然有些功能比如筛选同样的行时,俩者都可实现,但是如果数据量很大的话,相比而言,grep是更加方便的。所以grep筛选数据,sed再处理数据,这样无疑是最好的结果。至于cut、tr等命令,同样可以处理很多grep和sed要处理的问题,像筛选特定的字段,所以也是非常灵活的,要勤加练习,才能掌握的游刃有余。

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

(0)
mfwingmfwing
上一篇 2016-08-11
下一篇 2016-08-11

相关推荐

  • 软件编译安装小结

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1439073     本文主要针对 configure 和 cmake 做一个介绍以及我们重新配置编译参数文件时,都需要做哪些清…

    Linux干货 2016-08-15
  • 5.20 TOMCAT

    需要安装JDK JAVA Development Kit //JAVA 2 SE 的接口    TOMCAT 的安装: yum 安装 #yum install -y java-1.8.0-openjdk-devel 如下界面出现的话就是安装OK 注意:安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径; OpenJDK: JAVA_HOME…

    2017-07-09
  • 推荐-LVS原理详解

    LVS原理详解 LVS原理详解 LVS简介 LVS结构与工作原理 一.LVS的结构 二.LVS内核模型 三.LVS的包转发模型 1.NAT模型: 2.DR模型: 3.TUN模型: 四.LVS的调度算法 LVS的调度算法分为静态与动态两类。 1.静态算法(4种):只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况 2.动态算法(6种):前端的调度器…

    Linux干货 2016-03-27
  • ansible学习笔记

    简介:  在日常服务器维护中,从系统安装到程序部署再到发布应用,在大规模的生产环境中,如果需要手动的每台服务器进行安装配置将会给运维人员带来许多繁琐而又重复的工作。这就促使了在每个运维层次中出现了不同的自动化运维工具。 常见的自动化运维工具分类有以下几类:  系统安装运维工具(OS Provisioning):    …

    Linux干货 2015-08-17
  • 文件压缩,解压缩及归档

        在Linux的环境中,压缩文件的扩展名大多是:“*.tar, *.tar.gz, *.gz, *.Z, *.bz2, *.xz”,因为 Linux 支持的压缩指令非常多,且不同的指令所用的压缩技术并不相同,当然彼此之间可能就无法互通压缩/解压缩文件,当你下载到某个压缩文件时,自然就需要知道该文件是由哪种压缩指令…

    Linux干货 2016-08-18
  • HAProxy实战(一)

    实验目的 测试基于haproxy的反代和负载均衡配置 测试keepalived高可用haproxy的效果 实验要点 (1) 动静分离discuzx,动静都要基于负载均衡实现;(2) 进一步测试在haproxy和后端主机之间添加varnish缓存;(3) 给出拓扑设计;(4) haproxy的设定要求: (a) 启动stats;(b) 自定义403、502和5…

    Linux干货 2017-02-13