什么是sed?
sed(stream editor)是面向流的行编辑器,所谓面向流,是指接受标准输入的输入,输出内容到标准输出上。
sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中的“sed-command(sed命令)”就一条接着一条进行处理,知道脚本执行完毕。然后该行输出,模式(pattern space)被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
一、sed的语法格式与常用选项
在编写脚本中,-i选项是最常用的
注意:-i是在原文件进行操作,可以cp一份到/lianxi下
常用选项案例:
#显示第一行
[root@localhost lianxi]# sed -n '1p' /etc/passwd
#显示第一行至第十行
[root@localhost lianxi]# sed -n '1,10p' /etc/passwd
#显示第一行和第十行
[root@localhost lianxi]# sed -n '1p;10p' /etc/passwd
#显示从第一行开始步长为3的行
[root@localhost lianxi]# sed -n '1~3p' /etc/passwd
#显示从第一行开始打印三行
[root@localhost lianxi]# sed -n '1,~3p' /etc/passwd
#显示第一行和后面三行
[root@localhost lianxi]# sed -n '1,+3p' /etc/passwd
二、sed常用编辑命令
常用编辑命令案例:
#输出以#开头的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/p'
#输出不以#开头的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/!p'
#输出不以#开头的行和[0-9]开头的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n -r '/^#|^[0-9]/!p'
#将/etc/passwd文件里以bai开头的替换成tang
[root@localhost lianxi]# sed -i 's/^bai/tang/' /etc/passwd
#将/etc/passwd文件里第一行替换成good
[root@localhost lianxi]# sed -i '1c good' /etc/passwd
#在第四行后面追加huawei
[root@localhost lianxi]# sed -i '4a huawei' test.txt
#在第四行前面追加huawei
[root@localhost lianxi]# sed -i '4i huawei' test.txt
三、sed中的&的用法
四、模式空间(pattern space)和暂存空间(hold space)相关的命令
n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
!对所选行以外的所有行应用命令。
d)删除模式空间的内容并导致读入新的输入行,从而在脚本的顶端重新使用编辑方法
D)删除模式空间中直到第一个嵌入的换行符的这部分内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用于模式空间剩余的内容
注意:暂存空间里默认存储一个空行。
2!G 不是第二行的时候进行G操作
$!d 不是最后一行的时候进行d操作,是最后一行就不进行d操作
行号是sed读取文件里的第几行
五、sed工具的执行流程
sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明 -i 选项。
[root@liyingchao 12-20]# cat test.txt
0.0.0.0
1.1.1.1
2.2.2.2
[root@liyingchao 12-20]# sed -i 'N;N;s/\n/:80,/g;s/$/:80/' test.txt
[root@liyingchao 12-20]# cat test.txt
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
[root@liyingchao 12-20]# cat tect.txt
First
Second
Three
[root@liyingchao 12-20]# sed '1!G;h;$!d' tect.txt
Three
Second
First
四、练习
1.sed取出/etc/passwd文件的第一列
[root@localhost lianxi]# sed -n 's/:.*//p' passwd
####或者
[root@localhost lianxi]# sed -n 's/:/\n/p' passwd|sed -n '1~2p'
2.sed将PATH环境变量中的冒号换成换行 ->可以将PATH变量的内容重定向到一个文件里,例如path.txt
[root@localhost lianxi]# sed -n 's/:/\n/gp' path.txt
3.将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=no修改为yes或者修改下IPADDR后面的ip地址,具体ip自己定义
[root@localhost lianxi]# sed -i '/ONBOOT=/ s/no/yes/' ifcfg-ens33
4.只显示ip add的ip地址
[root@localhost lianxi]# sed -i '3~6 s/\//\n/' ippp.txt
[root@localhost lianxi]# sed -i '3~7 s/inet//' ippp.txt