加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

sed总结

发布时间:2020-12-14 00:26:32 所属栏目:Linux 来源:网络整理
导读:? 1、概述 2、查 2、增 3、删 4、改,替换 5、后向引用 ? 1、概述 sed的作用我们就记得两条就可以了:替换和增删除改查,也就是说今后当我们想对文件进行一些文字的替换和增删改查时就要想起sed。 sed的语法主要问成三部分,我们来举一个例子: sed -n 3p /e

?

1、概述

2、查

2、增

3、删

4、改,替换

5、后向引用

?

1、概述

sed的作用我们就记得两条就可以了:替换和增删除改查,也就是说今后当我们想对文件进行一些文字的替换和增删改查时就要想起sed。

sed的语法主要问成三部分,我们来举一个例子:

sed -n 3p /etc/passwd   语法分别是sed <选项-n> <对谁操作,3代表第3行> <干啥p,p代表打印>  <要操作的文件>

sed的执行过程

将文件吸入内存,然后在内存里面处理,处理好之后将空间内的内容倾倒到屏幕。

?

sed常用的选项其实就三个最为常用

-n:仅显示处理的行

-r:使其支持扩展的正则表达式

-i:sed默认不改变文件的内容,使用-i会改变文件的内容,慎用!

2、查

1、显示文件的哪一行,或是哪几行,要求我们提示知道要显示的东西哪几一行,如果不知道相要的行在文件当中排名第几,那么可以先用cat -n或是less -N进行查看确认。

[[email?protected] test.dir]# sed -n ‘2,3p‘ test.txt  #重要要体会加-n和不加n的区别,显示文件的第2行和第3行
钱 370831199305162kjl
孙 39083119920516245X
[[email?protected] test.dir]# sed -n ‘2,+1p‘ test.txt  #与上面的意思是一样的,就是写法不一样。
钱 370831199305162kjl
孙 39083119920516245X
[[email?protected] ~]# sed -n ‘$p‘ /etc/passwd       #查看文件的最后一行
zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash

?

2、我们想要显示出现某个关键字的行,比如找出/etc/passwd当中包含zhanghe关键字的行,我们就得使用正则表达式进行匹配,在sed当中一旦想要使用正则表达式的话就要使用//这两个符号,在这两上符号内部写正则表达式。

[[email?protected] ~]# sed -n ‘/zhanghe/p‘ /etc/passwd
zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash

 

[[email?protected] ~]# sed -n ‘//bin/bash$/p‘ /etc/passwd    #显示结尾是/bin/bash的行,注意转意字符
root:x:0:0:root:/root:/bin/bash
zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash

?

[[email?protected] ~]# sed -n ‘/root|zhanghe/p‘ /etc/passwd

#显示文件当中包含root或者zhanghe的行,但是结果什么都没显示?怎么回事?

[[email?protected] ~]# sed -nr ‘/root|zhanghe/p‘ /etc/passwd   #或者的符号 | 是扩展正则,需要在前面加一个选项r
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash

那么如果我想显示开头是root或者zhanghe的行,应该怎样显示呢?

[[email?protected] ~]# sed -nr ‘/^zhanghe|root/p‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash operator:x:11:0:
operator:/root:/sbin/nologin
zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash

这样写对吗?看结果的第二行,发现第二行的开头并不是root和zhanghe怎么回事呢?其实是因为我们的正则表达式写错了。

‘/^zhanghe|root/‘表示的是开头是zhanghe的行和包含root的行,中间的“|”字符把^zhanghe和root完全隔开了,我们可以使用小括号把zhanghe和root包起括号里面,然后在括号外面加一个行首锚定符,如下所示:

[[email?protected] ~]# sed -nr ‘/^(root|zhanghe)/p‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhanghe:x:1000:1000:zhanghe:/home/zhanghe:/bin/bash

其实使用正则表达式我们还可以匹配一个范围,比如打印出开头是root行一直到结尾nologin的中间的行,我们还是可以使用正则表达式,如下所示:

[[email?protected] ~]# sed -n ‘/^root/,/nologin$/p‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

其实用正则表达式匹配范围非常适合我们用来查看日志,假如说我们查看一下某个时间点到另一个时间点之间发生了什么事情?如下所示:

[[email?protected] ~]# sed -n ‘/Oct 21 15:42:48/,/Oct 21 16:09:26/p‘ /var/log/secure

2、增

我们在文本后面增加东西有几种方法呢?vim、nano、>>(echo 、cat)除了这些方法之后,在文本里面增加内容也只有sed了。

通过sed在文本里面增加内容实际上非常的简单,主要就用到三个选项:a/i/c。

a:apped在匹配到的行下面加

i:insert在匹配到的行上面加

c:把这一行内容替换成你想要的内容???? ?#看着是不是有点熟悉,grep也有类似的选项

?

[[email?protected] ~]# sed ‘3azhanghenzhanghe‘ /etc/passwd    #在文本的第3行下面添加两行内容zhanghe,zhanghe
[[email?protected] ~]# sed ‘/^root/azhanghenzhanghe‘ /etc/passwd  #在开头是root的行下面添加两行内容zhanghe,zhanghe

?

[[email?protected] ~]# sed ‘/^root/izhanghenzhanghe‘ /etc/passwd | head -4   
zhanghe
zhanghe
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[[email?protected] ~]# sed ‘2izhanghenzhanghe‘ /etc/passwd | head -4
root:x:0:0:root:/root:/bin/bash
zhanghe
zhanghe
bin:x:1:1:bin:/bin:/sbin/nologin

?

[[email?protected] ~]# sed ‘1czhanghe‘ /etc/passwd | head -2     #把第一行整体替换成zhanghe,这是替换的一整行
zhanghe
bin:x:1:1:bin:/bin:/sbin/nologin

3、删

删除最简单的了,就是使用一个局部命令d就可以了,如下所示:

sed ‘1d‘ /tmp/passwd                 #删除第一行
sed ‘1,3d‘ /etc/passwd               #删除1、2、3行
sed ‘/^root/,/nologin$/d‘ /tmp/passwd  #删除开头的root的行一直到结尾是nologin的行

4、改,替换

替换是sed最重要的功能,也比较简单,我们只需要记住sed替换的标准格式,即:

sed ‘[email?protected]@@g‘

#s是sub的意思,g是global就是全局的意思,整体意思就是全局替换。

用例子说话吧!

[[email?protected] tmp]# cat test.txt
zhanghe
zhangmin
zhangjia
zhanghe
zhanghezhanghe
[[email?protected] tmp]# sed ‘[email?protected]@[email?protected]‘ test.txt   #不加g,只会替换第一行
hello
zhangmin
zhangjia
hello
hellozhanghe
[[email?protected] tmp]# sed ‘[email?protected]@[email?protected]‘ test.txt  #加上g就是全局替换
hello
zhangmin
zhangjia
hello
hellohello

其实g所在的位置指代的是哪几代,g是指全部嘛,如果写一个3那就是第三列,也就是说我们可以指定替换哪一列当中的字符串,如下所示,我们替换第三列当中的zhanghe为hello:

[[email?protected] tmp]# cat test.txt
zhanghe
zhangmin
zhangjia
zhanghe 
zhanghezhanghe
zhanghe
[[email?protected] tmp]# sed ‘[email?protected]@[email?protected]‘ test.txt  #只有第三列变化了,第一列和第二列的zhanghe都没有被替换
zhanghe
zhangmin
zhangjia
zhanghe 
zhanghezhanghe hello     #注意,是按照词语进行替换的,我们上面讲的c选项是按行进行替换的。

5、后向引用

所谓的后向引用就是将想要引用的东西用括号包起来,如果再用到的话就可以直接调用了,就是这么简单。

[[email?protected] tmp]# echo 123456 | sed -r ‘[email?protected](.*)@[email?protected]‘    #.*就代表所有
123456
[[email?protected] tmp]# echo 123456 | sed -r ‘[email?protected](.*)@[email?protected]‘  #这个所有指代的就是5和6
56

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读