本文共 2519 字,大约阅读时间需要 8 分钟。
sed 英文的全称是stream editor翻译成中文流式编辑器,所有的处理动作都在模式空间处理,而保留空间默认是空的。支持正则表达式的元字符,默认支持基本正则表达,如果要使用扩展正则表达则需要加上-r选项。
1,语法有五种
(1)sed [ options ] 'scripts'(sed的子命令,sed的脚本) input_file...(如果有变量就要用双引号)
(2)sed [ options ] -f script_file input_file...(script_file可以 是事先写好的命令,sed的子命令放在一个文件里)
(3)sed 'addr1,addr2command' input_file...
(4)sed 'addr1,+ncommand' input_file ...(+n相对addr1)
(5)sed '/pattern/command' input_file...(表示只有能匹配到这个模式的行才会应用这个命令command)
2,常用选项:
-r:使用扩展正则表达式
-e:可以使用多个脚本
-i:直接操作原文件,在屏幕上不会再显示
-n:静默模式,只显示被匹配的行。一般与p命令一起用
3,sed 的子命令
(1)p:被匹配到的行被显示
显示3到5行
sed -n '3,5p' /etc/passwd
sed -n '3,+2p' /etc/passwd
如果不-n,则会是另外一种效果
(2)d:删除指定行
删除3到10行
sed '3,10d' /etc/passwd
(3)s:查找替换 s/pattern/string/(跟vim里的用法一样)
查找以数字开头的行,替换成hollo
sed 's/^[0-9].*/hello/g' /etc/inittab
(4)a \:在模式匹配到行的后面添加新内容,\要添加的内容
在/etc/inittab最后一行,添加hello,how are you?
sed '$a \hello,how are you' /etc/inittab($表示最后一行的意思)
如果要添加两行以上,就需要用到换行符\n
sed '$a \hello,how are you \n very good.' /etc/inittab
(5)i \:在模式匹配到的行前面添加新内容
在/etc/inittab第一行,添加hello,how are you?
sed '1i \hello,how are you?' /etc/inittab
(6)r file:读取file里的内容到某行下面
将/etc/hosts添加到/etc/inittab的第二行后面
sed '2r /etc/hosts' /etc/inittab
(7)w file:将模式匹配到的行保存到另外一个文件
将#开头的行保存到另外一个文件
sed '/^#/w /tmp/tmp.txt' /etc/inittab
(8)=:打印行号
为/etc/inittab每一行添加行号
sed '=' /etc/inittab
(9)x:保留空间和模式空间内容对调
sed 'x' /etc/passwd(结果第一行前面增加了一行空白)
(10)n:覆盖式把下一行读入模式空间
把偶数行删除
sed 'n;d' /etc/passwd (sed 默认读取一行到模式空间,执行n命令之前将模式空间的内容先处理,处理完之后开始执行n命令,n读取下一行,执行d命令)
(11)N:把下一行以追加的方式读入模式空间
把两行合并成一行,并用空格空开
sed 'N;s/\n/ /' /etc/passwd(由于每行都会有一个断行符,将\n替换成空格
(12) h(hold):将模式空间中的内容复制到保留空间,覆盖的方式
把文件里的内容颠倒下
sed '1!G;h;$!d' /etc/passwd(叹号表示对命令取反,第一行不执行G命令)
(13)H:将模式空间中的内容复制到保留空间,追加的方式
将第一行,第二行追加到最后一行
sed '1{h;d};2{D;d};$G' /etc/passwd
(14)g:将保留空间的内容复制到模式空间,覆盖的方式
将全部内容变量空白
sed 'g' /etc/passwd (如果加-i,则/etc/passwd里的内容全部变成空白,操作原文件慎重)
(15)G:将保留空间的内容复制到模式空间,追加的方式
给每一行添加空白
sed 'G' /etc/passwd
(16)b:跳转,略过符合的行 ,b label 表示先做标记,(label的长度不能超过7个)而: label 跳转到之前做label的位置
带有#号的行不显示
sed -n '/#;p' /etc/inittab
有数字的行添加#号,没有数字的行添加%
sed '.*[0-9].*/b para;s/.*/%&/;:para;s/.*[0-9].*/#&/g' /etc/inittab(先查找有数字的行,并做一个para的标记,没有数字的行就执行s/.*/%&/这条命令:para跳到s/.*[0-9].*/#&/g执行这个命令
(17)t labe:测试:前面的s命令执行成功就跳转到标记位置
(18)y/字符集1/字符集2/ (将字符集1的内容换成字符集2)
将b换成B,r换成R
sed 'y/br/BR/' /etc/passwd
(19)m~n:表示步近用法(m表示启始位,执行完后在m的基础上加n)
将1,6,11....显示出来
cat -n /etc/passwd | sed -n '1~5p' (每次在前一次基础上加5)
20,查找时间段的日志:
sed -n '/2016-02-23 13:47:41/,/2016-02-23 15:26:44/p' appbe.log2016-02-23