文本三剑客之sed用法总结

描述:

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

用法:
  sed [option]… ‘script' inputfile…

     常用选项:

    -n :不输出模式空间内容的自动打印

示例:仅列出/etc/passwd 文件内的第5-7行

[root@localhost ~]# nl /etc/passwd |sed -n '5,7p'
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    -e:  多点编辑

示例:处理/etc/fstab 或/etc/fstab/,使用sed命令取出其基名

[root@localhost ~]# echo "/etc/fstab" |sed -r -e 's@/$@@' -e 's@/.*/@@'
fstab
[root@localhost ~]# echo "/etc/fstab/" |sed -r -e 's@/$@@' -e 's@/.*/@@'
fstab

    -f / PATH/TO/SCRIPT_FILE :  从指定文件中读取编辑脚本

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

示例:处理/etc/fstab 路径,使用sed命令取出其目录名

[root@localhost ~]# echo "/etc/fstab/" |sed -r 's@[^/]+/?$@@'
/etc/

    -i:  原处编辑 (危险操作,不建议使用)

     script:地址命令

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

   (2) 单地址:

        #:  指定的行

       /pattern/ :被此处模式所能够匹配到的每一行

   (3) 地址范围:

        #,#

        #,+#

      /pat1/,/pat2/

       #,/pat1/

   (4) ~ :步进

       1~2  奇数行

       2~2  偶数行


     编辑命令:

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

示例:将/etc/passwd 的内容列出并打印行号,同时删除第2-5行

[root@localhost ~]# nl /etc/passwd |sed '2,5d'
     1root:x:0:0:root:/root:/bin/bash
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

   p:  显示模式空间中的内容

示例:将第2行打印到屏幕上

[root@localhost ~]# nl /etc/passwd |sed '2p'
     1root:x:0:0:root:/root:/bin/bash
     2bin:x:1:1:bin:/bin:/sbin/nologin
     2bin:x:1:1:bin:/bin:/sbin/nologin
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin

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

示例:在第2行后加上“drink tea”字样

[root@localhost ~]# nl /etc/passwd |sed '2a drink tea'
     1root:x:0:0:root:/root:/bin/bash
     2bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
     3daemon:x:2:2:daemon:/sbin:/sbin/nologin

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

示例:在第2行前加上“drink tea”字样

[root@localhost ~]# nl /etc/passwd |sed '2i drink tea'
     1root:x:0:0:root:/root:/bin/bash
drink tea
     2bin:x:1:1:bin:/bin:/sbin/nologin

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

示例:将第2-5行的内容替换成为“NO 2-5 number”

[root@localhost ~]# nl /etc/passwd |sed '2,5c NO 2-5 number'
     1root:x:0:0:root:/root:/bin/bash
NO 2-5 number
     6sync:x:5:0:sync:/sbin:/bin/sync

   w /path/to/somefile:  保存模式匹配的行至指定文件

示例:将第5-7行保存到/root/f1文件中

[root@localhost ~]# nl /etc/passwd |sed '5,7w/root/f1'
[root@localhost ~]# cat f1
     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6sync:x:5:0:sync:/sbin:/bin/sync
     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

   r /path/from/somefile :读取指定文件的文本至模式空间中匹配到的行后

   =:  为模式空间中的行打印行号

[root@localhost ~]# sed -n '/^$/=' /etc/issue     显示空白行的行号
3

   !:  模式空间中匹配到的行取反处理

[root@localhost ~]# sed -n '/^$/!=' /etc/issue     除空白行以外的行显示行号
1
2

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

示例:删除/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

[root@localhost ~]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg 
#
# DO NOT EDIT THIS FILE
if [ -s $prefix/grubenv ]; then
load_env
fi

     v:  替换标记:

     g:  行内全局替换

     p:  显示替换成功的行

[root@localhost ~]# sed -e's@^#@@p' /etc/fstab   显示替换成功的行
 /etc/fstab
 /etc/fstab
 Created by anaconda on Sun Aug  7 06:26:08 2016
 Created by anaconda on Sun Aug  7 06:26

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

[root@localhost ~]# sed 's@^#@@w/root/f3' /etc/fstab    将替换成功的行保存至/root/f3文件中
[root@localhost ~]# cat f3
 /etc/fstab
 Created by anaconda on Sun Aug  7 06:26:08 2016
 Accessible filesystems, by reference, are maintained under '/dev/disk'
 See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info


       高级编辑命令:

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

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

   g:  从保持空间取出数据覆盖至模式空间

   G: 从保持空间取出内容追加至模式空间

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

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

   N: 追加匹配到的行的下一行至模式空间

   d:  删除模式空间中的行

   D: 删除 当前模式空间开端至\n 的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

事先准备好的文件:

[root@localhost ~]# cat f1
1
2
3
4
5
6
7
8
9
10

1,sed  -n  'n;p' FILE

[root@localhost ~]# sed -n 'n;p' f1      显示偶数行
2
4
6
8
10

2,sed   '1!G;h;$!d'  FILE

[root@localhost ~]# sed '1!G;h;$!d' f1     逆序显示
10
9
8
7
6
5
4
3
2
1

3,sed  '$!N;$!D" f1

[root@localhost ~]# sed '$!N;$!D' f1     只显示最后两行
9
10

4,sed   '$!d'  FILE

[root@localhost ~]# sed '$!d' f1     只显示最后一行
10

5,sed   ‘G’ FILE

[root@localhost ~]# sed 'G' f1     在每一行的后面添加一个空白行
1

2

3

4

5

6

7

8

9

10

6,sed   ‘g’ FILE

[root@localhost ~]# sed 'g' f1     显示10个空白行

7,sed   ‘/^$/d;G’ FILE

[root@localhost ~]# sed '/^$/d;G' f1      显示的效果和第5题一样,但不同之处是:
1                              先将文件内的所有空白行删除,然后在每一行的后面添加一个空白行
2
3

8,sed   'n;d' FILE

[root@localhost ~]# sed 'n;d' f1        显示基数行
1
3
5
7
9

9,sed   -n '1!G;h;$p'  FILE

[root@localhost ~]# sed -n '1!G;h;$P' f1      显示最后一行
10


总结:

1,sed工具作为文本处理三剑客中的一员,体现了其强大的功能,在处理多文件和写脚本中的应用是很个广泛的,需多加练习,才能灵活掌握其用法

2,以行为单位的新增/删除功能,替换/显示功能,‘s/要被替换的字符串/新的字符串/g'功能是经常用到的,需记忆并多加练习才能熟练掌握




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

(0)
pingskypingsky
上一篇 2016-08-10 13:58
下一篇 2016-08-10 13:58

相关推荐

  • DNS and BIND 介绍及安装

    DNS DNS是什么 为什么要用DNS 域名 BIND DNS是什么 DNS:Domain Name System,域名系统DNS作为域名和IP地址相互映射的一个分布式数据库,能够让用户更方便的访问互联网。它的正向映射是吧一个主机和IP地址关联起来,它的反向映射则是IP地址到主机名。DNS协议运行在UDP协议上,使用53端口。 为什么要用DNS 连接到互联网…

    Linux干货 2016-05-28
  • corosync + pacemaker搭建高可用http

    一、实验图:    二、实验环境准备:  1)时间同步(172.16.2.15是时间服务器) [root@web1 ~]# crontab  -e   */5 * * * * /usr/sbin/ntpdate&nbsp…

    Linux干货 2015-06-30
  • Linux系统程序包管理之RPM

    rpm包概述 RPM 是 Red at Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理工具;在Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用。 RPM包里面都包含什么?里面包含可执行的二进制程序,…

    Linux干货 2016-08-24
  • N25期–第十五周作业

    1、 总结sed和awk的详细用法; 2、删除/boot/grub/grub.conf文件中所有行的行首的空白字符; # sed ‘s@^[[:space:]]\+@@’ /boot/grub/grub.conf 3、删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符; # sed ‘s@^#[[:space:]]*@@…

    Linux干货 2017-05-08
  • 磁盘管理之文件系统

    一,概述 文件系统是操作系统用于明确存储设备或分区上的文件的方 法和数据结构;即在存储设备上组织文件的方法。操作系统 中负责管理和存储文件信息的软件结构称为文件管理系统, 简称文件系统。  从系统角度来看,文件系统是对文件存储设备的空间进行组 织和分配,负责文件存储并对存入的文件进行保护和检索的 系统。具体地说,它负责为用户建立文件,存入、读出、修…

    Linux干货 2016-09-05
  • CentOS6/7下不关机识别新添加的scsi硬盘

    1)需求说明 在虚拟机中,我们在服务器开机的状态下添加新的磁盘或者说从存储上映射某个LUN区域给服务器,不重启系统的情况下,往往不能够直接识别到磁盘,在遇到这种情况的时候,我们可以让系统重新扫描让服务器重新识别到磁盘。 2)处理步骤 下面看一下在系统不重启的情况,如何让系统认识新的磁盘,并能对其分区与格式化 1、在开机状态下新增磁盘 2、执行下面的命令 ec…

    Linux干货 2016-07-22