文本三剑客之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

相关推荐

  • Cent OS 6 编译方式安装LAMP

    细节要求: (1) 三者分离于三台主机; (2) 一个虚拟主机用于提供phpMyAdmin;另一个虚拟主机用于提供wordpress; (3) PHP使用FastCGI+xcache; (4) httpd使用非prefork的mpm模式; 一、CentOS6环境准备 1、OS(CentOS6.8)下开发环境包的安装,编译安装程序包需要使用 #yum grou…

    Linux干货 2017-02-24
  • 2. 初识shell

        在Linux早期, 可以用来工作的只有shell. 那时, 系统管理员, 程序员和系统用户都坐在Linux命令行终端前, 输入文本命令, 查看文本输出. 而现在, 因为有了绚丽的图形化桌面环境, 在系统上找到shell提示符都变得困难起来. 接下来将会讨论提供命令行环境需要什么, 然后带你逐步了解可能会在各种L…

    Linux干货 2016-11-06
  • Linux基础之LVM

    一.LVM介绍 LVM(Logic Volume Management)逻辑卷管理器,其基本原理就是将多个磁盘的分区在逻辑上进行组合,使之成为一个大容量的磁盘进行使用,可以实现动态的分配存储空间。 LVM基本模型以及基本术语,如下图所示: PV:物理卷,从逻辑上与磁盘分区具有同样功能的设备 VG:卷组,由一个或多个物理卷组成 LV:逻辑卷,具有逻辑边界的存储…

    Linux干货 2016-11-09
  • RAID各级别的特性及使用介绍(8.3博客作业)

    RAID各级别的特性及使用介绍 介绍: 独立硬盘冗余阵列(RAID:Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列,简称磁盘阵列。 组成: 多块磁盘,RAID控制器(硬件RAID、软件RAID)     硬件RAID:自带CPU的RAID卡,不消耗服务器资源,可通过备份…

    Linux干货 2016-07-16
  • 浅谈Linux终端类型

    Linux终端类型 作者:任飞鹏            日期:2016-10-13 终端是什么: 终端(Terminal)也称终端设备,是计算机网络中处于网络最外围的设备,主要用于用户信息的输入以及处理结果的输出等。 早期计算机系统中,由于计算机主机…

    Linux干货 2016-10-19
  • ip子网划分

    ip子网划分 人们为了通信方便,给每台计算机分配了一个类似我们电话号码一样的标识地址。IP就好比一个人的指纹一样,在INTERNET中是独一无二的(公网中)。我们可以通过ip查询到使用该ip的主机。 现在的IP分为ipv4和ipv6。前者是32位二进制组成,为了防止IP不够用由此研发出后者ipv6,ipv6是由128位二进制组成。ipv6中包含ip的数量相当…

    Linux干货 2017-07-01