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 11:22
下一篇 2017-12-03 14:59

相关推荐

  • 到处都是Unix的胎记

    一说起Unix编程,不必多说,最著名的系统调用就是fork,pipe,exec,kill或是socket了(fork(2),execve(2), pipe(2), socketpair(2), select(2), kill(2), sigaction(2))这些系统调用都像是Unix编程的胎记或签名一样,表…

    Linux干货 2015-04-03
  • 文件、目录——Linux基本命令(7)

    1.     文件名规则 (1)文件名最长255个字节          (2)包括路径在内文件名称最长4095个字节 (3)文件颜色          蓝色-…

    2017-07-17
  • ansible学习笔记之2 ad-hoc篇

    ansible学习笔记之2 ad-hoc篇 ansible学习笔记之2 ad-hoc篇 ansible 学习笔记 ad-hoc ansible学习笔记之2 ad-hoc篇 使用ansible ad-hoc搭建lnmp/lamp 编辑host文件,通过秘钥认证ssh连接主机 前期环境准备 在lnmp上安装lnmp 其中 ad-hoc搭建mysql主从 配置文件…

    2016-11-21
  • 用户及相关权限命令

    2018-03-26

    2018-03-26
  • mysql主从架构/模式

    MySQL Replication: Master/Slave Master: write/read Slaves: read 为什么? 冗余:promte(提升为主),异地灾备 人工 工具程序 负载均衡:转移一部分“读”请求; 支援安全的备份操作: … 主/从架构: 异步复制:master只需要完成自己的数据库操作即可。至于slaves是否收到…

    2016-11-27
  • 磁盘阵列(RAID)简介

    资料 RAID(Redundant Arrays of Inexpensive Disks 廉价磁盘冗余阵列)即磁盘阵列,磁盘阵列是由多个价格比较便宜的磁盘组合成的一个容量巨大的磁盘组,其原理是利用数组方式来制作磁盘组,配合数据分散排列的设计,配合数据分散排列的设计,提升数据的安全性。它把数据分别存放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能,因…

    Linux干货 2017-04-17