shell四剑客之sed

概述

Stream EDitor, 行编辑器

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

sed  三大功能 : (1)查找符合条件的行   (2)编辑被匹配到的行并输出到屏幕(最大的优点就是,输出出来的不会破坏文件本身) (3) 替换(其实这也算编辑)

注意:-i参数有危险,请慎用!如果非得要用,请备份。

-r 支持拓展正则表达式,原理同grep

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

常用选项:

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

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

-r: 支持使用扩展正则表达式 -i: 原处编辑

script: '地址命令'

 地址定界:

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

(2) 单地址: #: 指定的行 /pattern/:被此处模式所能够匹配到的每一行

(3) 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/

(4) ~:步进 1~2 奇数行 2~2 偶数行

编辑命令:

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

p: 显示模式空间中的内容 a \text:在行后面追加文本;支持使用\n实现多行追加

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

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

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

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

=: 为模式空间中的行打印行号 !:模式空间中匹配行取反处理

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

替换标记: g: 行内全局替换 p: 显示替换成功的行 w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

(1) 查找符合条件的行

[root@centous1 ~]# sed '2p' /etc/passwd   ## p参数 显示模式空间的内容这里直接加np,
root:x:0:0:root:/root:/bin/bash             被匹配的行是被重复出现的
bin:x:1:1:bin:/bin:/sbin/nologin                   
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@centous1 ~]# sed -n '2p' /etc/passwd ##  这里前边加-n参数, 只显示被匹配到的行
bin:x:1:1:bin:/bin:/sbin/nologin

[root@centous1 ~]# sed -n '2,10p' /etc/passwd  ###通过行数可以指定要查看的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

[root@centous1 ~]# sed -n '/root/p' /etc/passwd  #### 还可以通过关键词
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@centous1 ~]# sed -n '2,/root/p' /etc/passwd  ####### 行数和关键词的结合使用,来查找行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

[root@centous1 ~]# cat f1
1

2

3

4

5
[root@centous1 ~]# sed -n '/^$/=' f1    显示空行号  ‘=’ 显示行号
2
4
6
8

(2) 编辑匹配的行

a 在行后添加文本  i 在行前添加文本  c替换源文件文本 
[root@centous1 ~]# sed -e '/1/a\user1' -e '/2/i\user2' -e '/3/c\user3' f1 
1                 ## 特别说明,-e参数,多点编辑  
user1

user2
2

user3

4

5

[root@centous1 ~]# sed '/^$/d' f1  ###删除空行  d  参数,删除匹配到的行
1
2
3
4
5

[root@centous1 ~]# sed '/^$/d' f1 | sed '1,3d'  ### 可以指定删除多少行
4
5

[root@centous1 ~]# cat f1 | sed '1a tea' #### 指定哪一行添加或者替换
1
tea

2

3

4

5

(3)替换

[root@centous1 ~]# cat f1
aaa
bbb
ccc
ddd
eee
fff
[root@centous1 ~]# sed 's/aaa/abc/g' f1 ## s参数的标志就是替换模式,其中三个'/'可以使其他的标 
abc                点符号(@@@或者###...等)g参数表示全局替换,           
bbb                  如果不加,就只替换第一个匹配到的。       
ccc
ddd
eee
fff

[root@centous1 ~]# sed -n 's/root/&supermen/p' /etc/passwd ##在替换的词前边加&,表示前边被替换
rootsupermen:x:0:0:root:/root:/bin/bash              的还存在,只是在后边添加
operator:x:11:0:operator:/rootsupermen:/sbin/nologin
  
[root@centous1 ~]# sed -n 's/root/supermen&/p' /etc/passwd  ## 同理在后边添加&,表示前边被替
supermenroot:x:0:0:root:/root:/bin/bash                 换的还存在,只是在前边添加
operator:x:11:0:operator:/supermenroot:/sbin/nologin

然后我们来介绍一下危险的-i参数

-i:直接修改读取的档案内容,而不是由萤幕输出。
如果对自己的命令操作十分自信,可以用他来编辑文件,但是也要确保安全,这时我们可以用以下方法,修改之前
做个备份
[root@centous1 ~]# cp /etc/passwd f1
[root@centous1 ~]# sed -i.bak 's/root/supermen/g' f1
[root@centous1 ~]# cat f1
supermen:x:0:0:supermen:/supermen:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centous1 ~]# ls -a
.                .bash_history  .cshrc  install.log         .pki    
..               .bash_logout   f1      install.log.syslog  .tcshrc    
123.sh           .bash_profile  f1.bak    

且用且珍惜

高级编辑命令:

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

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

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

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

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

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

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

d: 删除模式空间中的行

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

示例;

sed -n 'n;p' FILE

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

sed '$!N;$!D' FILE

sed '$!d' FILE

sed ‘G’ FILE

sed ‘g’ FILE

sed ‘/^$/d;G’ FILE

sed 'n;d' FILE

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

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

(1)
forestforest
上一篇 2016-08-15 14:31
下一篇 2016-08-15 14:31

相关推荐

  • 文件挂载

    (1)创建目录 /mnt/file,利用dd命令创建一个大文件; (2)将文件格式化,这个文件有文件系统,相当于一个分区; (3)直接用blkid 看不到文件,可以用mount -o loop 挂载文件,挂载上后,文件就可以当作分区来用了; (4)挂载文件的优势在于,方便移动。分区不能随便移动而文件可以; centos6是要加-o loop的 centos7…

    2017-05-03
  • N22网络班第一周作业

    1、 描述计算机的组成及其功能。 运算器、控制器、存储器、输入设备、输出设备 运算器、控制器 :cpu 运算和逻辑计算 存储器:缓存和保存数据 输入设备、输出设备:用户和计算机交互设备和界面 2、 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。 Slackware系列: suse   opensuse debian系列: ubun…

    Linux干货 2016-08-15
  • Linux磁盘管理高级

    Linux磁盘管理高级 LVM Btrsh LVM 逻辑卷管理(LVM)指系统将物理卷管理抽象成一个逻辑卷,包括重新设定文件系统的大小,LVM可以弹性的更改LVM的容量,通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中的PE加到LV中以加大容量。 LVM还有快照的功能,快照区与原本的LV共用很多PE的区块,因…

    Linux干货 2016-09-09
  • RPM软件包管理

                                                RPM 软件包管理 1、rpm软件包管理: &nbs…

    系统运维 2016-09-01
  • 交换分区创建和磁盘配额的使用

    一、交换分区的建立与启用:     交换分区是作为内存的一个辅助分区,在内存吃紧时,交换分区会作为内存的一部分使用,但是效率比起内存来说会很低下,在一个硬盘分区时最好使用柱面较小的柱面作为交换分区,因为在机械硬盘转速一定的情况下,越靠近外面的磁道,线速度越大,读取到的扇区越多,一定程度上有利于提高性能   &…

    Linux干货 2016-08-29