Linux文本三剑客--------Sed命令

什么是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

猜你喜欢

转载自blog.csdn.net/weixin_60067160/article/details/122051639