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
打印第二行两遍
#sed -n “2p” /etc/issue
只打印第二行
#cat -n /etc/passwd|sed -n “1,3p”
只打印1,3行
#cat -n /etc/passwd|sed “1,10d”
删除1-10行、
#cat -n /etc/passwd|sed -n ‘$p’
打印最后一行
#cat -n /etc/passwd |sed -n “1,+4p”
打印1+4行
#sed -n ‘/^r/,/^a/p’ /etc/passwd
打印从 r开头到a开头的之间的所用行 注意:sed命令会把文件里所有符合r开头的行到后面所有的行都会打印一遍
#cat -n /etc/passwd|sed ‘2~2d’
用到的命令:(d)删除
删除偶数行
#cat -n /etc/passwd |sed -n “1~2p”
只打印奇数行
打印偶数行
用到高级用法:n
#cat -n /etc/passwd |sed -n ‘n;p’
#sed “9a\ ailas cdent=’cd /etc/sysconfig/netwark-scripts/”
在~/。bashrc文件的第九行添加别名ailas cdent=’cd /etc/sysconfig/netwark-scripts/”
注意:以上内容都只是在屏幕上打印出来了文件并没有真正被改掉
#sed -i.bak “9a\ailas cdent=’cd /etc/sysconfig/netwark-scripts/” ~/.bashrc
加上-i.bak 之后会默认在家目录里创建一个与源文件一样的文件但是会加-i 后面的字符为文件后缀例如这张图上-i后面有个.bak那么这个就是这个文件的后缀,而后面的 “9a\ a是表示在第九行后面 插入一行
这回是真正改了文件了 ,所以 -i 选项用起来一定要谨慎
#sed “/^# Source/ixxxxx” ~/.bashrc
在上一行添加内容:i
在~/.bashrc 的# Source 的这一行的上一行添加一行字符 (//)这个表示模式。在这个模式可以使用正则表达式 那么我这里表示的是# Source的行的上一行添加字符,那么这里的(i)的作用就是在上一行添加字符 ,当然这只是显示并没有真正改文件
#sed ‘/^SELINUX=/c SELINUX=disabled’ /etc/selinux/config
替换内容 :c
替换SELINUX=这一行的内容
被改后的文件
读入文件内容
用到命令:r
#sed “/^root/r /etc/issue” /etc/passwd
r 的功能就是读取文件内容添加到指定行的下一行,注意:r 读取的内容会添加到所有匹配的行下面,也就是说如果这个文件里有10root开头的行,那么每一行下面都会有被读取文件的内容
打印匹配到的字符的行号
#sed “/^alias/=” ~/.bashrc
用到的命令:=
打印除了以alias开头的其他行
用到的命令 : !
注意:这里不能用双引号,因为双引号能识别里面的特殊字符,这里面的!号就被识别成了调用上一条命令
把文件中想过滤出来的内容指定一个文件中
#sed ‘/^alias/w /app/.bashrc.bak‘ ~/.bashrc
用到的命令:w
这里的w功能是把~/.bashrc文件中的所有以alias开头的行存放到/app/下的.bashrc.bak这个文档里
/app/.bashrc.bak内容
打印以某个字符串结尾的行
#sed -n ‘/bash$/p’ /etc/passwd
用到的命令:-n ,p
打印/etc/passwd 文件里的所有以bash结尾的行
重难点
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
搜索替代:
用到命令:s///,(@@@,###)这些符号都可以作为分隔符
错误做法
sed ‘s@/bin/bash$@/sbin/nolongin$@’ /etc/passwd (错误)
注意第一个之第二个@之间代表正则表达式也是搜索内容,第二个到地三个@之间代表字符串也就是替代内容,这里错就错在/sbin/nolongin后面带了一个$导致内容替换之后多了一个$
正确做法
#sed ‘s@/bin/bash$@/sbin/nolongin@’ /etc/passwd
分组正则表达式,以及后向引用
#sed -r ‘s@(/bin/bash$)@###\1$$$$@’ /etc/passwd
前面@(/bin/bash$)@是把(/bin/bash$)作为一个分组 而后面@###\1$$$$@中间的这个\1表示后项引用 前面的 /bin/bash作为内容 而###\1表示在/bin/bash前面加上###,\1$$$就表示在/bin/bash后面添加$$$
替换etc/selinux/config文件中的SELINUX=enforcing
#sed -r ‘s@(^SELINUX=)enforcing@\1disabled@’ /etc/selinux/config
把(^SELINUX=)作为一个分组,后面的 enforcing就是不要的内容,而这个\1就是调用前面的分组的内容(^SELINUX=),那么\1后面的disabled就是在SELINUX=后面添加的内容
结果就会是SELINUX=disabled 把之前的 enforcing给覆盖了
取centos6.ip地址
#ifconfig eth0|sed -n ‘2p’|sed -r ‘s@.*inet addr:(.*) Bcast.*@\1@’
#ifconfig eth0|sed -nr ‘2p;s@.*inet addr:(.*) Bcast.*@\1@p’
这条命令是把两条命令合并成一条了
替换GRUB_DISABLE_RECOVERY=”true” 把true替换成false
原来的状态
#cat /etc/default/grub |sed -r ‘s/(GRUB_DISABLE_RECOVERY=”)true”/\1false”/’
去版本号
①。#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’
取目名
#echo “/etc/sysconfig/network-scripts/ifcfg-ens33″|sed -r ‘s@(^/.*/)(.+)/?@\1@’
(目录名) (基名)(搜索替代后向引用1)(^/.*/)
取基名
#echo “/etc/sysconfig/network-scripts/ifcfg-ens33″|sed -r ‘s@(^/.*/)(.+)/?@\2@’
(搜索替代后向引用2)(.+)/?
替换多个内容
用到命令:-e (多点编辑)
第一个-e ‘s/#Name/Name/ 意思是搜索#NameVirtualHost*:80这一行替换成NameVirtualHost*:80
第二个 -e 表示的是以#<VirtualHost开头的行到</VirtualHost>开头的行搜索#替换为空
(模式①) 到 (模式②) 搜索#替换为空
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/89389