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
下一篇 2016-08-15

相关推荐

  • 8月3号 用户权限作业

     1,当用户xiaoming 对/testdir  目录无执行权限时,意味着无法做哪些操作?   先创建目录/testdir,接着修改目录的/testdir的权限,用xiaoming的身份去进入/testdir目录 [root@localhost ~]# mkdir /testdir [root@l…

    Linux干货 2016-08-08
  • Linux磁盘管理

    设备文件 一切皆文件 open(), read(), write(), close() 磁盘结构 磁盘接口类型 并行 IDE:133MB/s SCSI:640MB/s 串口 SATA:6Gbps SAS:6Gbps USB:480MB/s rpm rotationsper minute 硬盘每分钟转数 硬盘结构  图一…

    Linux干货 2016-08-30
  • 第一次测试

    1.第一层  video  视频 2.第二层  audio  音频 3.第三层  字幕 查看视频详细信息 ffmpeg -i 视频文件 转码修改视频格式 ffmpeg -i 输入文件   输出文件格式 视频文件中提取音频和视频 提取视频中的音频 ffmpeg -i CP0454900262.ts -…

    Linux干货 2017-02-06
  • 关于压测的宏观个人总结

    工作角色定位 首先先从宏观角度来评估下本次的压测工作. 从工作职责上说本次压测理应由组内其它同学来完成,个人从旁协助或指导即可。团队成员的成长对我个人来说才是更大的成长。所以即使这次压测工作完成的再出色,都会因为是由我来完成的,所以都不能称之为优秀的。对我个人的成长最多是项目经验的增长和问题的积累,但对组员来说如何让他们做到现有成果的80%是我需要帮助他们来…

    Linux干货 2015-04-21
  • keepalived实现高可用LVS

    前言 vrrp介绍:  vrrp(Virtual Router Redundancy Protocol)虚拟路由冗余协议;就是把多个路由器或多个网关设备加入到组中,然后在这一组中虚拟出一个路由器,此虚拟路由器有真是的IP和MAC地址,客户端将网关指向此虚拟路由器的IP;客户端向此虚拟路由器的IP和MAC地址发起请求时,由活动路由器负责响应;当活动路…

    Linux干货 2015-07-23
  • 0805 作业

     201608051、当天课程内容笔记2、当天练习3、预习4、取本机ip地址 5、取各分区利用率的数值 6、统计/etc/init.d/functions 文件中每个单词出现的次数,并按频率从高到低显示 7、/etc/rc.d/init.d/functions或/etc/rc.d/init.d/functions/"  取目录名…

    Linux干货 2016-08-07