sed

Stream EDitor, 行编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前 处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后 ,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环 。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空 模式空间,但不会清空保留空间。这样不断重复,直到文件末 尾。文件内容并没有改变,除非你使用重定向存储输出。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复 操作,编写转换程序等
参考: http://www.gnu.org/software/sed/manual/sed.html

用法:
sed [option]… ‘script’ inputfile…
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
script:
‘地址(文件行数)命令’
地址定界:
(1) 默认不给地址:对全文进行处理
(2) 单地址: #: 指定的行,$:最后一行 /pattern/(模式匹配):被此处模式所能够匹配到的每一行
(3) 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/ (4) ~:步进 1~2 奇数行 2~2 偶数行
#sed “2p” /etc/issue
打印第二行两遍
sed01
#sed -n “2p” /etc/issue
只打印第二行
sed02
#cat -n /etc/passwd|sed -n “1,3p”
只打印1,3行
sed03
#cat -n /etc/passwd|sed “1,10d”
删除1-10行、
04sed
#cat -n /etc/passwd|sed -n ‘$p’
打印最后一行
sed05
#cat -n /etc/passwd |sed -n “1,+4p”
打印1+4行
sed
06
#sed -n ‘/^r/,/^a/p’ /etc/passwd
打印从 r开头到a开头的之间的所用行 注意:sed命令会把文件里所有符合r开头的行到后面所有的行都会打印一遍
07sed
#cat -n /etc/passwd|sed ‘2~2d’
用到的命令:(d)删除
删除偶数行
sed08
#cat -n /etc/passwd |sed -n “1~2p”
只打印奇数行
打印偶数行
用到高级用法:n
#cat -n /etc/passwd |sed -n ‘n;p’
09
sed
#sed “9a\ ailas cdent=’cd /etc/sysconfig/netwark-scripts/”
在~/。bashrc文件的第九行添加别名ailas cdent=’cd /etc/sysconfig/netwark-scripts/”
10
sed
注意:以上内容都只是在屏幕上打印出来了文件并没有真正被改掉
#sed -i.bak “9a\ailas cdent=’cd /etc/sysconfig/netwark-scripts/” ~/.bashrc
加上-i.bak 之后会默认在家目录里创建一个与源文件一样的文件但是会加-i 后面的字符为文件后缀例如这张图上-i后面有个.bak那么这个就是这个文件的后缀,而后面的 “9a\ a是表示在第九行后面 插入一行
sed11
这回是真正改了文件了 ,所以 -i 选项用起来一定要谨慎
sed12
#sed “/^# Source/ixxxxx” ~/.bashrc
在上一行添加内容:i
13
在~/.bashrc 的# Source 的这一行的上一行添加一行字符 (//)这个表示模式。在这个模式可以使用正则表达式 那么我这里表示的是# Source的行的上一行添加字符,那么这里的(i)的作用就是在上一行添加字符 ,当然这只是显示并没有真正改文件
sed#sed ‘/^SELINUX=/c SELINUX=disabled’ /etc/selinux/config
替换内容 :c
替换SELINUX=这一行的内容
sed14
被改后的文件
sed15
读入文件内容
用到命令:r
#sed “/^root/r /etc/issue” /etc/passwd
r 的功能就是读取文件内容添加到指定行的下一行,注意:r 读取的内容会添加到所有匹配的行下面,也就是说如果这个文件里有10root开头的行,那么每一行下面都会有被读取文件的内容
sed16
打印匹配到的字符的行号
#sed “/^alias/=” ~/.bashrc
用到的命令:=
sed17
打印除了以alias开头的其他行
用到的命令 : !
注意:这里不能用双引号,因为双引号能识别里面的特殊字符,这里面的!号就被识别成了调用上一条命令
sed
把文件中想过滤出来的内容指定一个文件中
#sed ‘/^alias/w /app/.bashrc.bak‘ ~/.bashrc
用到的命令:w
这里的w功能是把~/.bashrc文件中的所有以alias开头的行存放到/app/下的.bashrc.bak这个文档里
sed17
/app/.bashrc.bak内容
sed20
打印以某个字符串结尾的行
#sed -n ‘/bash$/p’ /etc/passwd
用到的命令:-n ,p
打印/etc/passwd 文件里的所有以bash结尾的行
sed22

重难点
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
搜索替代:
用到命令:s///,(@@@,###)这些符号都可以作为分隔符
错误做法
sed ‘s@/bin/bash$@/sbin/nolongin$@’ /etc/passwd (错误)
23
注意第一个之第二个@之间代表正则表达式也是搜索内容,第二个到地三个@之间代表字符串也就是替代内容,这里错就错在/sbin/nolongin后面带了一个$导致内容替换之后多了一个$
sed
正确做法
#sed ‘s@/bin/bash$@/sbin/nolongin@’ /etc/passwd
sed24
分组正则表达式,以及后向引用
#sed -r ‘s@(/bin/bash$)@###\1$$$$@’ /etc/passwd
前面@(/bin/bash$)@是把(/bin/bash$)作为一个分组 而后面@###\1$$$$@中间的这个\1表示后项引用 前面的 /bin/bash作为内容 而###\1表示在/bin/bash前面加上###,\1$$$就表示在/bin/bash后面添加$$$
25
sed
替换etc/selinux/config文件中的SELINUX=enforcing
#sed -r ‘s@(^SELINUX=)enforcing@\1disabled@’ /etc/selinux/config
把(^SELINUX=)作为一个分组,后面的 enforcing就是不要的内容,而这个\1就是调用前面的分组的内容(^SELINUX=),那么\1后面的disabled就是在SELINUX=后面添加的内容
结果就会是SELINUX=disabled 把之前的 enforcing给覆盖了
sed26
取centos6.ip地址
#ifconfig eth0|sed -n ‘2p’|sed -r ‘s@.*inet addr:(.*) Bcast.*@\1@’
sed27
#ifconfig eth0|sed -nr ‘2p;s@.*inet addr:(.*) Bcast.*@\1@p’
这条命令是把两条命令合并成一条了
sed28
替换GRUB_DISABLE_RECOVERY=”true” 把true替换成false
原来的状态
sed29
#cat /etc/default/grub |sed -r ‘s/(GRUB_DISABLE_RECOVERY=”)true”/\1false”/’
sed30
去版本号
①。#cat /etc/centos-release|sed -nr ‘s@.*release (…).*@\1@p’
②。#cat /etc/centos-release|sed -nr ‘s@.*release ([^.]..).*@\1@p’
③。#cat /etc/centos-release|sed -nr ‘s@.*release ([^.]).*@\1@p’
31
sed
取目名
#echo “/etc/sysconfig/network-scripts/ifcfg-ens33″|sed -r ‘s@(^/.*/)(.+)/?@\1@’
(目录名) (基名)(搜索替代后向引用1)(^/.*/)
取基名
#echo “/etc/sysconfig/network-scripts/ifcfg-ens33″|sed -r ‘s@(^/.*/)(.+)/?@\2@’
(搜索替代后向引用2)(.+)/?
sed32
替换多个内容
用到命令:-e (多点编辑)
sed33
第一个-e ‘s/#Name/Name/ 意思是搜索#NameVirtualHost*:80这一行替换成NameVirtualHost*:80
第二个 -e 表示的是以#<VirtualHost开头的行到</VirtualHost>开头的行搜索#替换为空
(模式①) 到 (模式②) 搜索#替换为空
sed

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/89389

(0)
xiaoli@xiaoli@
上一篇 2017-12-03
下一篇 2017-12-03

相关推荐

  • vsftp的使用(土著篇)

        这个vsftp本地用户登录模式(简称土著)配置方法论坛网站有一堆堆的,都是默认的东西,就那么多也写不出什么花来。     还是直接上酸菜好了,接着上回提到的vsftp的接着用,首先查看下你vsftp的配置情况。      这是上次匿名用户的配置,稍微得改一改。 配置本地用户登录的配…

    2017-07-30
  • 马哥教育的第一天

    春天的北京,比想象中的更加温暖,跨越一千三百公里的距离,我来到马哥教育位于北京昌平区的校区,传说中的春寒料峭似乎遗忘了北京,自湖北出门的时候,车外还是淅淅沥沥的小雨,到达北京,迎接我的却是春风拂面熏人醉。 安顿了两天之后,我们三十期的开班典礼在三月二十六号早上的九点钟准时开始,由云珍老师主持,传说中的马哥、王老师、张sir、宗华老师纷纷登台致辞,分别从运维工…

    2018-03-26
  • 【LINUX编译安装程序】Centos7.4编译安装httpd 2.4.29

    举例:Centos7.4编译安装httpd 2.4.29

    Linux干货 2018-03-17
  • Nginx浅谈(一)

    浅谈nginx(一) 此文主要介绍nginx的基础知识及其基本配置,一为巩固,二为记录 知识点: nginx的作用 nginx的基本配置框架 nginx一些常用模块介绍 1、什么是nginx     nginx是一款免费的,开源的,高性能的HTTP服务软件,它不仅能     够支…

    Linux干货 2017-01-15
  • 马哥教育网络19期+第十三周课程练习

    1、建立samba共享,共享目录为/data,要求:(描述完整的过程)   1)共享名为shared,工作组为magedu;   2)添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为用户名;   3)添加s…

    Linux干货 2016-08-12
  • 自制Linux系统

    自制Linux系统 1.首选准备一台Linux虚拟机并添加一块新硬盘 2.分区并创建文件系统,创建两个必要的分区根分区和boot分区 fdisk /dev/sdb  分区 mke2fs -t ext4 /dev/sdb1    创建boot文件系统 mke2f…

    Linux干货 2016-09-16