文本三剑客之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
下一篇 2016-08-10

相关推荐

  • 网络分层基础概念与TCP,IP协议解析

    网络分层基础概念:   与ISO的OSI网络分层模型不同。网络分层事实上的标准为TCP/IP 的网络分层模型。   下图是他们是他们之间的对应关系。   左边为OSI网络分层模型。右边为TCP/IP的网络分层模型。 网络分层,是将一个大而复杂的网络,拆分为多个层次,每个层次单独完成自己的任务,多个层次再结合起来,完成一个复杂的通…

    2017-05-04
  • 加密和解密技术基础(01) ~ 105分钟

    加密和解密技术基础(01) ~ 105分钟 讲课思路: 互联网通信机制 –> 网络协议模式(osi,tcp/ip模型) –> 数据通信安全  à 数据加密 –> 加密算法 –> OpenSSL是什么 à SSL通信原理 –> CA –> OpenSSL命令用法 à CA 自签及签证演示 1.1 &nbs…

    Linux干货 2016-09-19
  • linux学习总结-linux基础(之一)

    一、计算机的组成及其功能 冯诺依曼结构的计算机由运算器、控制器、存储器和输入设备、输出设备五部分组成。冯诺依曼理论的要点是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。 控制器:控制程序执行; 存储器:记忆程序和数据; 输入设备:输入数据和程序; 输出设备:输出处理结果。 二、Linux发行版 Linux的发型版本众多,大体可以分为两类,一类是商…

    Linux干货 2016-09-23
  • 第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;   (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;   (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; [root@localhost ~]# fdis…

    Linux干货 2017-07-04
  • 马哥教育网络班21期+第3周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 #思路:使用who命令列出列出当明显登录的所有用户,使用cut命令取出用户名,使用uniq命令去重 [root@Centos6 ~]# who | cut -d" " -f1&n…

    Linux干货 2016-07-07
  • 基于BIND实现的DNS正反解析及主从DNS的配置

    基于BIND实现的DNS正反解析及主从DNS的配置 标签: DNS正反解析 DNS主从复制 测试环境 准备2台虚拟机,一台为主DNS,IP地址为:192.168.103.161。另一台为从DNS,IP地址为:192.168.103.162两台都装好bind,所需包有:bind,bind-utils,bind-libs 主DNS的配置文件 配置主文件/etc/…

    Linux干货 2016-04-11